0

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

这是我的简单代码:

#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]->string 修改为 (*data)[len].string

任何想法,为什么我们称 data[len]->string 发生一些随机段错误?

4

3 回答 3

1

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

于 2012-05-27T07:49:07.020 回答
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]->string 现在会给你正确的答案。在这里,您为 *data 分配了一个数组。因此,正确的方法是 strcpy((*data)[len].string, "A")。请注意使用点运算符而不是箭头运算符来取消引用字符串。

于 2012-05-27T08:37:46.340 回答
0

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

于 2012-05-27T09:18:37.383 回答