目前,我尝试了解C中的动态数组。
当我为指针“ptr”分配内存时,它正在工作而不输入我需要的元素数量(在malloc函数中)。
现在,问题是,不明白它为什么会起作用。
如果有人能给我一些建议,那会很棒。
感谢。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct daten
{
char name[20];
int alter;
};
int main(void)
{
struct daten *ptr;
int i;
ptr = malloc(sizeof(struct daten *)); //works fine!!
//ptr = malloc(sizeof(struct daten *)*4);
strcpy(ptr[0].name, "Daniel");
ptr[0].alter = 23;
strcpy(ptr[1].name, "Fabian");
ptr[1].alter = 29;
strcpy(ptr[2].name, "Helmut");
ptr[2].alter = 34;
strcpy(ptr[3].name, "Katrin");
ptr[3].alter = 21;
for(i = 0; i<4; i++)
{
printf("%s\t", ptr[i].name);
printf("%d\n", ptr[i].alter);
}
return 0;
}
答案 0 :(得分:2)
由于这是一种未定义的行为,任何事情都可能发生:您的程序可能正常工作。但这并不意味着它是正确的程序。
因此,必须分配足够的内存来执行此操作,即sizeof(struct daten) * 4
个字节。
答案 1 :(得分:2)
关键字是“它没有正常工作”。最多似乎有效。
你在这里有未定义的行为(因为你为一个结构分配空间,但是,你写的是一个更大的空间)。未定义的行为可以做任何事情;这并不意味着程序必须崩溃。这包括它可能“正常工作”。
另外,你误解了应该分配多少内存。对于类型T
,分配给类型为T *
的指针,应分配sizeof(T)
个字节,如下所示:
ptr = malloc(sizeof(struct daten) * 4);
更好:
ptr = malloc(sizeof(*ptr) * 4);
答案 2 :(得分:0)
这是未定义的行为。你的工作简直(不)幸运。如果您在其他系统上尝试此操作,则可能会也可能不会。
你应该这样做:
ptr = malloc(sizeof(struct daten)*4);
操作正在成功,因为数据可能正好在分配的空间之后写入内存。由于这是未分配的空间,因此您没有任何问题,它是working
。当您尝试使用此空间时, 会出现问题。
答案 3 :(得分:0)
答案 4 :(得分:0)
ptr[3]
也可以表示为*(ptr + 3)
,其中“3”缩放为(3 * sizeof(*p))
。因此,它将数据复制到超出您已分配的内存的某些内存位置。
你很幸运,或者我应该说你不走运。你所做的有点像随机刺伤某人,你可能会击中一个重要器官,或者你可能不会。这次你没有,编译没有调试的代码(例如)来改变内存布局,你可能会遇到会破坏进程的东西。或者也许不会杀死它,但只是伤害它。
您遇到过为什么C语言编程必须遵守纪律的原因之一。不,它没有“工作”,你的测试不足以证明它失败了。
另见calloc
。