题
我已经简化的一个问题,我已经试图隔离问题,但它不是帮助。
我有一个2维char列代表的记忆。我想通过一个参考模拟存储器的功能。在功能测试的内容的存储器我只是想迭代过存储器和打印出来的内容,在每一行。
该程序打印出的第一行,然后我得到seg故障。
我的程序如下:
#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故障在第二次圆,并且我将感谢任何建议。
非常感谢
Joe
解决方案
尝试:
printf("%s\n", (*memory_ref)[i]);
目前的版本相当于
*(*(memory_ref + i));
这是因为 []
操作者具有更高优先级的引用 *
.这意味着当 i
比0,你试着读存储器之后 char***
临时 memory_ref
第二个版本是等于 (*memory_ref)[i]
这意味着你将引正确的记忆。
编辑: 原因,它的工作第一迭代是因为:
*(*(memory_ref + 0)) == *((*memory_ref) + 0)
其他提示
这看起来像一个优先问题。在[]是得到评估的第一次,*第二。什么,你会需要的是什么样的以下你的第一个代码的例子...
printf("%s\n", (*memory_ref)[i]);
不隶属于 StackOverflow