我已经简化的一个问题,我已经试图隔离问题,但它不是帮助。

我有一个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]);

快速的解决方法是使用

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

但我怀疑你有一个问题在线

 memory[0] = "Mem 0";

这些不复制string"Mem0"进入你的存储器阵列。他们的存储[i]点。

你需要明确地复制的数据的使用 strncpy

例如char s="Mem0";strncpy(存储器1, s,max(strlen(s)+1,29))//最大的30=(29char+'\0',因为这是行长你分配的-好#define此作为一个恒定

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top