gpt4 book ai didi

c - 在函数内部填充动态分配的结构

转载 作者:行者123 更新时间:2023-12-04 10:27:15 25 4
gpt4 key购买 nike

我正在尝试制作一个接受预分配内存指针作为输入并在该位置用数据填充结构数组的函数。在此示例中,我希望输出为:

W 100
L 200

然而,第一行是正确的,但第二行没有打印任何字符和一个零。我做错了什么?

typedef struct{
char word;
long number;
}record;

void makerec(record** data){
data[0]->word='W';
data[0]->number=100;
data[1]->word='L';
data[1]->number=200;
}

int main(){
record* data=(record*)malloc(sizeof(record)*1000);
makerec(&data);
printf("%c %ld\n",data[0].word,data[0].number);
printf("%c %ld\n",data[1].word,data[1].number);
free(data);
return 0;
}

最佳答案

您没有处理正确的类型。只需更改:

void makerec(record** data) {

到:

void makerec(record * data) {

和:

makerec(&data);

到:

makerec(data);

以及将 data[0]->word='W'; 和 friend 更改为 data[0].word = 'W';

data已经是一个指针,你想改变它指向的东西,直接传给makerec就可以了。如果你想让 makerec() 指向不同的东西,你会传递一个指向 data 的指针,但这不是你在这里做的,所以只是传递 数据本身是正确的。

附带于您的主要问题,但是:

record* data=(record*)malloc(sizeof(record)*1000);

应该是:

record* data = malloc(1000 * sizeof *data);
if ( !data ) {
perror("memory allocation failed");
exit(EXIT_FAILURE);
}

注意事项:

  1. 您不需要(在我看来,也不应该)强制转换 malloc() 和 friend 的返回值

  2. sizeof *data 优于 sizeof(record),因为如果 data 的类型发生变化,它会继续工作,更重要的是,它消除了将 sizeof 运算符应用于错误类型的可能性,这是一个常见错误。

  3. 颠倒 1000sizeof *data 的位置只是为了装饰,让多个 '*' 更容易理解。

  4. 如果分配失败,您应该始终检查 malloc() 的返回值,如果失败则采取适当的措施(例如退出您的程序)。

关于c - 在函数内部填充动态分配的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36346954/

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