c-解引用问题

c-解引用问题,c,dereference,C,Dereference,我已经简化了一个问题,我一直在尝试隔离这个问题,但它没有帮助 我有一个二维字符数组来表示内存。我想把对内存模拟的引用传递给一个函数。在测试内存内容的函数中,我只想遍历内存并打印出每行的内容 程序打印出第一行,然后我得到seg fault 我的计划如下: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> void test_memory(

我已经简化了一个问题,我一直在尝试隔离这个问题,但它没有帮助

我有一个二维字符数组来表示内存。我想把对内存模拟的引用传递给一个函数。在测试内存内容的函数中,我只想遍历内存并打印出每行的内容

程序打印出第一行,然后我得到seg fault

我的计划如下:

#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_ref在函数中创建内存的本地版本,则我会得到正确的输出:

因此:

这正是我想要的,但是制作一个本地版本的内存是没有用的,因为我需要能够从函数中更改原始内存的值,我只能通过取消对原始2d字符数组的引用来完成

我不明白为什么我会在第二轮中出现seg故障,如果有任何建议,我将不胜感激

非常感谢

试试:

printf("%s\n", (*memory_ref)[i]);
当前版本相当于

*(*(memory_ref + i));
这是因为
[]
运算符的优先级高于取消引用
*
。这意味着当
i
大于0时,您尝试读取
char***
temporary
memory\u ref

第二个版本等于
(*memory\u ref)[i]
,这意味着您将为正确的内存编制索引

编辑:它在第一次迭代中起作用的原因是:

*(*(memory_ref + 0)) == *((*memory_ref) + 0)

这似乎是一个优先问题。首先对[]求值,然后对*求值。对于您的第一个代码示例,您需要的是如下内容

printf("%s\n", (*memory_ref)[i]);

快速解决方法是使用

printf("%s\n", (*memory_ref)[i]);
但我怀疑你的线路有问题

 memory[0] = "Mem 0";
它们不会将字符串“Mem 0”复制到内存数组中。它们使内存指向字符串

您需要使用显式复制数据

e、 g。 char s=“Mem 0”;
strncpy(内存,s,max(strlen)+1,29))//最大30=(29 char+'\0',因为这是您分配的行长度-最好将其定义为一个常量

这很有效。非常感谢。我不知道为什么。我猜括号允许在尝试访问解引用操作的结果之前完成解引用操作。这仍然不能解释f的行为阵列中的第一个字符串正在打印。为什么第一轮我没有收到seg错误?非常感谢Joe@Joe至于为什么它在第一轮中起作用,请参见我编辑的答案。
printf("%s\n", (*memory_ref)[i]);
printf("%s\n", (*memory_ref)[i]);
 memory[0] = "Mem 0";