C指针数组和动态内存分配malloc

3

我正在尝试使用指针将存储在std中的数据存入数组中。主要声明d为int *d; 并使用x = getdata(&d);调用函数。当我使用gdb逐步执行时,它在for循环的第一次迭代时死亡,当它尝试执行*d[i]=val;时。

int getdata(int **d)
{ 
    int count,val,i,j=0; 

    scanf("%d", &count);

    d = malloc(sizeof *d * count);
    for( i = 0; i < count-1; i++) {

    scanf("%d",val);

    *d[i]=val;  

    }

    for ( i = 0; i < count; i++)
            printf("Number %d\n",*d[i]);

    return count;

}


*d = malloc(sizeof **d * count);,以及 (*d)[i] - Kerrek SB
也许他想要 (*d)[i] - wildplasser
1
scanf("%d", &val); 顺便说一句,一个严谨的编译器应该会对此发出警告。 - wildplasser
3个回答

2
你手头的是一个指向数组的指针,而不是指针数组。
1)malloc 返回的是一个 void*,所以你需要将结果赋值给 *d 而不是 d 2)你需要的数据大小是一个 int,而不是一个 int* (使用 *d 得到的是一个 int*,其中 **d 是一个 int)。
*d = malloc(sizeof(**d) * count);

3)对数组进行索引需要稍微不同的语法

(*d)[i] = val;

printf("%d\n", (*d)[i]);

4) 第二个scanf需要一个指针,而不是一个整数

scanf("%d", &val);

*d = malloc(count * sizeof **d );sizeof *type* 更加健壮。 - wildplasser
我同意这个。已编辑。 - Mel Nicholson
你不需要在 sizeof expression 中使用括号(这就是我在前面加上“count”的原因)。 - wildplasser
我仍然遇到分段错误。 - AdamTopi
我在你的第二个scanf中错过了&val。 - Mel Nicholson

2
*d = malloc(count * sizeof(int));

那么

(*d)[i] = val

2
内存应该按照以下方式分配。
*d = malloc(count * sizeof **d);

值应按以下方式访问。
(*d)[i] = val;

目前还不清楚为什么你要分配count个元素,但在输入循环中只初始化了count - 1个元素(并且在输出循环中打印了所有count个元素)。


谢谢,是我忘记在 scanf("%d",&val) 中加上 & 符号了! - AdamTopi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接