gpt4 book ai didi

c - 小分配大小的 calloc 上的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 08:03:07 24 4
gpt4 key购买 nike

我已经编写了模拟选举的代码,并且按预期工作,但是当我将 BALLOT_SIZE 修改为 7,并更改 int v[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;
}

我已经 try catch calloc 调用的返回值并根据 NULL 检查它,但在它能够检查返回值之前,它出错了(在这个例子中,BALLOT_SIZE 是 7):

struct Ballot * New_Random_Ballot() {

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

if (New_Ballot == NULL) {
perror("could not allocate ballot\n");
}

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

最佳答案

问题出在这里:

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。上面的原始答案需要一些澄清。

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

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 位宽。在 8bit cpu 上通常没有与指针关联的段,管理 far 内存是程序员的责任。即通过设置适当的控制寄存器来更改可见的扩展内存页面。

关于c - 小分配大小的 calloc 上的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44619060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com