为什么以下代码不起作用?

时间:2013-09-08 16:03:15

标签: c pointers initialization

  1. 以下代码尝试创建一个类型为presence的新变量(一种结构)但是当我通过gdb运行它时,它表明变量在每次迭代中都具有相同的地址?本地变量在重新声明时是否应该获得不同的地址?

    presence* hashtable[MAX];
    int i = 0;
    
    printf("---------ENTERING DATA FOR THE HASHTABLE------------------\n");
    while (i < MAX)
    {
    
            presence item; /* Same address on every iteration */
            printf("Enter item id : ");
            scanf("%d",&item.id);
    
            printf("Enter item name : ");
            item.name = (char*)malloc(SIZE*sizeof(char));
            getchar();
            fgets(item.name,SIZE,stdin);
    
            putItem(hashtable,&item);
            i++;
    
    }
    
  2. 当一个类型存在的项目放在哈希表中时,我应该分配内存然后分配项目还是简单地执行它(参考下面的代码)

    int putItem(presence* hashtable[], presence* item)
    {
        int key = hash(item->id);
        hashtable[key] = (presence*)malloc(sizeof(presence)); /* Required or not? or do the below straight away?*/
        hashtable[key] = item;
    }
    

4 个答案:

答案 0 :(得分:2)

For 1:你应该有presence *item;指针类型变量,分配它并用它来填充数据。您当前的实现在每次迭代中使用相同的变量。

while (i < MAX)
{

        presence *item; /* pointer */
        item = malloc(sizeof(*item));
        printf("Enter item id : ");
        scanf("%d",&item->id);

        printf("Enter item name : ");
        item->name = (char*)malloc(SIZE*sizeof(char));
        getchar();
        fgets(item->name,SIZE,stdin);

        putItem(hashtable,item);
        i++;

}

For 2:您不需要分配内存。这条线

hashtable[key] = (presence*)malloc(sizeof(presence));

不需要。

但请确保key小于MAX,其大小为hashtable。此外,您可能希望适当地处理冲突。

答案 1 :(得分:1)

您的本地变量是不稳定的。创建实例时,当变量超出范围时,它会消失。因此,您可以在以下迭代中获得相同的地址。

在秒实例中,您需要malloc presence的空格,并需要使用memcpy复制它。您应该执行hashtable[key] = item

,而不是使用memcpy ( hashtable[key], item, sizeof ( item ) );

答案 2 :(得分:1)

  1. 本地变量通常只有一个地址。由于变量item超出了循环后沿的范围,编译器可以在下一次循环执行时自由地重用其存储。无论哪种方式,将指向局部变量的指针存储到寿命超过局部变量范围的数据结构都是一个坏主意。
  2. 取决于您的需求:如果哈希表中的值应该与传入的值无关,则应在函数中分配内存。如果他们不应该,那就没有。

答案 3 :(得分:1)

  

重新声明时,局部变量不应该获得不同的地址吗?

我不明白为什么它是必须的(对于任何变量)。事实上,编译器将它放在同一个内存位置是一个非常合理的决定。

但无论如何,您当前采用的方法是错误的:您在超出范围后使用本地(块范围自动)变量的地址,这是未定义的行为。您应该为各个元素动态分配内存。

  

当一个类型存在的项目放在哈希表中时,我应该分配内存然后分配项目还是只做

“简单地”是指“不分配内存”吗?

除此之外,这完全取决于不同职能之间的合同。另外,为内容分配内存在您的特定情况下,这些行:

hashtable[key] = (presence*)malloc(sizeof(presence));
hashtable[key] = item;

会泄漏内存,因为在分配后立即覆盖指向已分配内存的指针。所以不,不要做内存分配。但是,如果您没有声明哈希表(不是其中的项目!)

presence* hashtable[MAX];

(即一个指针数组),但你有一个指针指针:

presence **hashtable;

必须为哈希表分配内存(显然在插入函数之外):

presence **hashtable = malloc(sizeof(*hashtable) * N_ITEMS);

另外,请 do NOT cast the return value of malloc()!