【发布时间】:2010-04-29 11:16:15
【问题描述】:
我已经简化了一个我一直试图隔离问题的问题,但它没有帮助。
我有一个二维字符数组来表示内存。我想将对内存模拟的引用传递给函数。在测试内存内容的函数中,我只想遍历内存并打印出每一行的内容。
程序打印出第一行,然后出现段错误。
我的程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
void test_memory(char*** memory_ref) {
int i;
for(i = 0; i < 3; i++) {
printf("%s\n", *memory_ref[i]);
}
}
int main() {
char** memory;
int i;
memory = calloc(sizeof(char*), 20);
for(i = 0; i < 20; i++) {
memory[i] = calloc(sizeof(char), 33);
}
memory[0] = "Mem 0";
memory[1] = "Mem 1";
memory[2] = "Mem 2";
printf("memory[1] = %s\n", memory[1]);
test_memory(&memory);
return 0;
}
这给了我输出:
memory[1] = Mem 1
Mem 0
Segmentation fault
如果我更改程序并通过取消引用 memory_ref 在函数中创建内存的本地版本,那么我会得到正确的输出:
所以:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
void test_memory(char*** memory_ref) {
char** memory = *memory_ref;
int i;
for(i = 0; i < 3; i++) {
printf("%s\n", memory[i]);
}
}
int main() {
char** memory;
int i;
memory = calloc(sizeof(char*), 20);
for(i = 0; i < 20; i++) {
memory[i] = calloc(sizeof(char), 33);
}
memory[0] = "Mem 0";
memory[1] = "Mem 1";
memory[2] = "Mem 2";
printf("memory[1] = %s\n", memory[1]);
test_memory(&memory);
return 0;
}
给我以下输出:
memory[1] = Mem 1
Mem 0
Mem 1
Mem 2
这是我想要的,但是制作内存的本地版本是没有用的,因为我需要能够从函数中更改原始内存的值,而这只能通过取消引用指向原始 2d char 的指针来实现数组。
我不明白为什么我会在第二轮中出现 seg 错误,如果您有任何建议,我将不胜感激。
非常感谢
乔
【问题讨论】:
标签: c dereference