在c中输入动态结构数组的malloc函数中的元素个数

时间:2013-01-13 16:34:48

标签: c arrays pointers dynamic malloc


目前,我尝试了解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;
}

5 个答案:

答案 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)

嗯,你刚写到未分配区域。这可以工作,但从长远来看,你会遇到破解,因为很可能你的堆被写入未分配的区域而被破坏,因此连续的malloc可能会失败或崩溃你的程序。

答案 4 :(得分:0)

ptr[3]也可以表示为*(ptr + 3),其中“3”缩放为(3 * sizeof(*p))。因此,它将数据复制到超出您已分配的内存的某些内存位置。

你很幸运,或者我应该说你不走运。你所做的有点像随机刺伤某人,你可能会击中一个重要器官,或者你可能不会。这次你没有,编译没有调试的代码(例如)来改变内存布局,你可能会遇到会破坏进程的东西。或者也许不会杀死它,但只是伤害它。

您遇到过为什么C语言编程必须遵守纪律的原因之一。不,它没有“工作”,你的测试不足以证明它失败了。

另见calloc