分配大小较小的calloc上的分段错误

分配大小较小的calloc上的分段错误,c,C,我已经编写了模拟选举的代码,这正如预期的那样有效,但是当我将BALLOT_SIZE修改为7,并更改intv[BALLOT_SIZE]={0,1,2,3,4,5,6}在New_Random_BALLOT()中,语句struct BALLOT*New_BALLOT=calloc(1,sizeof(struct BALLOT*))给了我一个分段错误。应该注意的是,将BALLOT_SIZE设置为6并修改int v[BALLOT_SIZE]={0,1,2,3,4,5}的定义以及这些变量的所有较小设置(例如

我已经编写了模拟选举的代码,这正如预期的那样有效,但是当我将BALLOT_SIZE修改为7,并更改
intv[BALLOT_SIZE]={0,1,2,3,4,5,6}
在New_Random_BALLOT()中,语句
struct BALLOT*New_BALLOT=calloc(1,sizeof(struct BALLOT*))给了我一个分段错误。应该注意的是,将BALLOT_SIZE设置为6并修改
int v[BALLOT_SIZE]={0,1,2,3,4,5}
的定义以及这些变量的所有较小设置(例如长度4、3或2)都会正确执行。为了清晰起见,我删除了洗牌数组的代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#define BALLOT_SIZE 5
#define NUM_VOTERS 50

struct Ballot {
    int votes[BALLOT_SIZE];
};

struct Ballot * New_Random_Ballot() {

    int v[BALLOT_SIZE] = {0,1,2,3,4}; 
    struct Ballot * New_Ballot = calloc(1, sizeof(struct Ballot *));

    for (int j = 0; j < BALLOT_SIZE; j++) {
        New_Ballot->votes[j] = v[j];
    }
    return New_Ballot;
}

void Hold_Election(struct Ballot * Election[NUM_VOTERS]) {
    for (int i=0; i < NUM_VOTERS; i++) {
        Election[i] = New_Random_Ballot();
    }   
}

int main() {
    struct Ballot * Election[NUM_VOTERS];
    Hold_Election(Election);

    //free memory
    for (int i=0; i < NUM_VOTERS; i++) {
        free(Election[i]);
    }
    return 0;
}
#包括
#包括
#包括
#定义选票大小5
#定义投票人数50
结构投票{
整数票[选票大小];
};
结构选票*新的随机选票(){
int v[选票大小]={0,1,2,3,4};
结构投票*新投票=calloc(1,sizeof(结构投票*);
对于(int j=0;j投票[j]=v[j];
}
重新投票;
}
无效举行选举(结构投票*选举[NUM_选民]){
for(int i=0;i
我尝试捕获calloc调用的返回值并将其与NULL进行比较,但在它能够检查返回值之前,它出现了故障(在本例中,BALLOT_SIZE为7):

struct Ballot*新建随机投票(){
INTV[选票大小]={0,1,2,3,4,5,6};
结构投票*新投票=calloc(1,sizeof(结构投票*);
如果(新投票==NULL){
perror(“无法分配选票”);
}
对于(int j=0;j投票[j]=v[j];
}
重新投票;
}
问题在于:

calloc(1, sizeof(struct Ballot *));  // Ballot* is a pointer of size 4 or 8
替换为:

calloc(1, sizeof(struct Ballot));  // struct Ballot is a structure of some size
正如下面@Olaf正确指出的,指针大小可能取决于CPU。上面的原始答案需要澄清一下

对于任何数据类型、结构或union AnyType,ISO标准保证了这种平等性:

sizeof(AnyType*) == sizeof(void*)
void*的大小由CPU架构定义。在32位平台上,指针长度为4字节,在64位平台上,指针长度为8字节

在16位平台上,如i386,指针通常为16位长,但也有远指针,
sizeof(void far*)
通常为32位(16位表示段,16位表示地址)

在8位平台上,如i8051,逻辑将规定指针为8位宽,但这不是很有用,因此在8位CPU上指针通常为16位宽。8位CPU上通常没有与指针关联的段,程序员负责管理远端内存。i、 e.通过设置适当的控制寄存器来更改可视扩展内存页。

问题在于:

calloc(1, sizeof(struct Ballot *));  // Ballot* is a pointer of size 4 or 8
替换为:

calloc(1, sizeof(struct Ballot));  // struct Ballot is a structure of some size
正如下面@Olaf正确指出的,指针大小可能取决于CPU。上面的原始答案需要澄清一下

对于任何数据类型、结构或union AnyType,ISO标准保证了这种平等性:

sizeof(AnyType*) == sizeof(void*)
void*的大小由CPU架构定义。在32位平台上,指针长度为4字节,在64位平台上,指针长度为8字节

在16位平台上,如i386,指针通常为16位长,但也有远指针,
sizeof(void far*)
通常为32位(16位表示段,16位表示地址)


在8位平台上,如i8051,逻辑将规定指针为8位宽,但这不是很有用,因此在8位CPU上指针通常为16位宽。8位CPU上通常没有与指针关联的段,程序员负责管理远端内存。i、 e.通过设置适当的控制寄存器来更改可见扩展内存页。

calloc(1,sizeof(struct Ballot*))
-->
calloc(1,sizeof(struct Ballot))因为
sizeof(struct Ballot*)
是指针大小。不是对象大小。
sizeof(struct Ballot*)
指针不是它指向的对象!sizeof(struct Ballot)==Ballot\u SIZE*sizeof(int),而sizeof(struct Ballot*)==sizeof(void*)==4(或64位应用程序为8)。*有很大不同。
calloc(1,sizeof(struct Ballot*))
-->
calloc(1,sizeof(struct Ballot))
因为
sizeof(struct Ballot*)
是指针大小。不是对象大小。
sizeof(struct Ballot*)
指针不是它指向的对象!sizeof(struct Ballot)==Ballot\u SIZE*sizeof(int),而sizeof(struct Ballot*)==sizeof(void*)==4(或64位应用程序为8)。*有很大的不同。你确定吗?“选票*是一个大小为4或8的指针”-请提供一个标准的参考,保证指针是4或8字节!使用
1
2
字节的现有实现是否不符合要求?因此,我使用
struct Ballot*New_Ballot
创建一个指针,然后指向一个与Ballot结构大小相同的空间区域,而不是指向与指针大小相同的空间?相反,但这是一个想法。每次使用错误的大小调用calloc,然后写入时,都会破坏堆。您考虑过调用malloc吗?calloc有2个参数,专门用于分配数组。malloc只有一个参数。除了提高一点效率和增加一点可读性之外,没有其他优势。你确定吗?“选票*是一个大小为4或8的指针”-请提供一个保证指针为4或8字节的标准参考!使用
1
2
字节的现有实现是否不兼容?因此我正在创建