我只是了解内存动态,并做过实验,但仍然卡住了。已经搜索了一些,但没有给出任何结果。
这是我的简单代码:
#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;字符串出现一些随机的段错误?
答案 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次错误。如果有人能向我解释,我会非常高兴。