分段错误使用Realloc超过3次

时间:2012-05-27 07:40:04

标签: c memory-management

我只是了解内存动态,并做过实验,但仍然卡住了。已经搜索了一些,但没有给出任何结果。

这是我的简单代码:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

    typedef struct kata kata;
    struct kata {
        char string[256];
    };

void load(kata **data)
{
        int len = 0;

        while( len < 5 ) {


            (*data) = (kata *) realloc ((*data), (len + 1) * sizeof(kata));
            printf("copy A - %d\n", len);

            strcpy(data[len]->string, "A");
            len++;
        }
        getch();
}

int main() {    
    kata *data = NULL;

    load(&data);

}

和我的问题,为什么我在调试它时总是出现分段错误(在3)?

非常感谢您的建议

编辑:

仍然不知道为什么会发生错误,但我刚刚找到解决方案..

只需将data [len] - &gt; string修改为(* data)[len] .string

任何想法,为什么我们称数据[len] - &gt;字符串出现一些随机的段错误?

3 个答案:

答案 0 :(得分:1)

data[len]->string应为 (*data)[len]->string (*data)[len].string

答案 1 :(得分:0)

我不知道为什么代码不适合你。我尝试了一个类似的例子,但它确实有用。

int main(void)
{
  int *ptr = NULL;

  ptr=(int *) realloc(ptr, 1*sizeof(int)); cout<<"1"<<endl;
  ptr=(int *) realloc(ptr, 2*sizeof(int)); cout<<"2"<<endl;
  ptr=(int *) realloc(ptr, 3*sizeof(int)); cout<<"3"<<endl;
  ptr=(int *) realloc(ptr, 4*sizeof(int)); cout<<"4"<<endl;
  ptr=(int *) realloc(ptr, 5*sizeof(int)); cout<<"5"<<endl;
  return 0;
}

我试图运行你的代码。这引起了strcpy线的问题。如果你注释掉那一行。它工作正常。

data [len] - &gt;字符串现在会给你正确的答案。在这里你已经为*数据malloced数组。因此,正确的方法是strcpy((* data)[len] .string,“A”)。 注意使用点运算符而不是箭头运算符来取消引用字符串。

答案 2 :(得分:0)

我相信在while循环本身的第二次迭代中使用strcpy应该存在访问冲突。我想知道它是如何工作第二次并导致第3次错误。如果有人能向我解释,我会非常高兴。