我有以下C代码:
char buffer[255];
char ***data = NULL;
int i = 0;
int size = 10;
**data = (char*) calloc(size, sizeof(char**));
while(fgets(buffer, 255, database)) {
if(i + 1 >= size) {
size += 10;
**data = (char*) realloc(**data, size*sizeof(char**));
}
char **line = str_split(buffer, ',', 6);
**data[i++] = **line;
}
我是C的菜鸟。我不会后来理解我的代码。但我想要一个3D字符数组(在Java中我说的是一个2D字符串数组)。第一个[]是我的文本文件中的行,'fgets'来自'database'(我不知道有多少行,这就是为什么我想要它动态)。第二个[]和第三个[]填充了str_split的值。
str_split工作正常,那就是代码:
char** str_split(char* str, const char a_delim, int count) {
char **result;
char *token;
char *rest = str;
char delim[] = { a_delim, '\0' };
result = (char**) malloc(sizeof(char*) * count);
int i = 0;
while((token = strtok_s(rest, delim, &rest))) {
*(result + i++) = token;
}
return result;
}
所以问题是在运行时我收到以下错误:
访问冲突写入位置0x00000000。
有什么问题?
答案 0 :(得分:2)
第一个分配应该如下:
data = (char***) calloc(size, sizeof(char**));
类似于realloc,最后是
data[i++] = line;
问题是您尝试取消引用数据(**data
)以为其分配calloc的值,但数据为空以便开始,因此您将获得访问冲突。通常,在引用它之前,应确保指针不为null。