gpt4 book ai didi

c - 取消引用问题

转载 作者:行者123 更新时间:2023-12-02 07:52:45 25 4
gpt4 key购买 nike

我已经简化了我一直试图隔离问题的问题,但它没有帮助。

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

程序打印出第一行,然后出现段错误。

我的程序如下:

#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 的指针来完成数组。

我不明白为什么我会在第二轮遇到段错误,如果有任何建议,我将不胜感激。

非常感谢

最佳答案

尝试:

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

当前版本相当于

*(*(memory_ref + i));

这是因为 [] 运算符的优先级高于取消引用 *。这意味着当 i 大于 0 时,您尝试在 char*** 临时 memory_ref

之后读取内存

第二个版本等于 (*memory_ref)[i],这意味着您将索引正确的内存。

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

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

关于c - 取消引用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2736779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com