【问题标题】:Passing a matrix of strings to a function that modifies it将字符串矩阵传递给修改它的函数
【发布时间】:2019-11-22 19:12:51
【问题描述】:

我正在尝试在 main 中分配一个字符串矩阵,并让其他函数访问和修改它,所有其他函数都可以看到修改。

这就是我分配矩阵的方式:

int i = 0;
char*** jobs = calloc(30, sizeof(char **));
for(int z = 0; z < 30; z++) {
    jobs[z] = calloc(30, sizeof(char*));
    for(int i = 0; i < 30; i++) {
        jobs[z][i] = calloc(30, sizeof(char));
    }
}

这就是我将矩阵传递给函数循环的方式:

loop(&i, &jobs);

*i 也需要 'i' 被他们全部修改和访问,但它似乎工作,所以不用担心。

这是我对函数循环的定义:

void loop(int *i, char**** jobs)

它还调用另一个函数执行,并将矩阵传递给它。 执行应该能够对其他函数可见的矩阵进行修改。

我正在尝试在“执行”中访问矩阵“作业”中的元素之一:

 *jobs[*i][0] = "hello";
 *i += 1;

*注意我也使用了我通过引用传递的“i”。

编辑: 我的问题:我是否按照我应该的方式传递矩阵? 例如,我需要在另一个名为 jobs 的函数中访问我在 exec 中添加的元素,该函数会打印这些元素,但它会打印“”(什么都没有)。

这是工作

int sh_jobs(char**** jobs){
int i = 0;
while(jobs[i][0] != NULL) {
    printf("[%d]   %s   %s   %s\n", i, *jobs[i][0], *jobs[i][1]);
    i++;
}
return 1;

}

它确实进入了 while 循环,这意味着值不是 NULL,但它不打印元素。

jobs调用执行

sh_jobs(jobs);

【问题讨论】:

  • 你实际上并没有问过问题。
  • @ScottHunter 我的更改仅保留在本地,其他功能看不到。我将对其进行编辑并添加我的问题。
  • 如果您愿意struct string_s { char *str; }; struct strings_s { struct string_s *strings; }; struct pragraph_s { struct strings_s *paragraphs; }; struct book_s { struct paragraph_s *paragraphs; },这对您和其他人来说会更容易。然后传递一个指向书的指针只是loop(... struct book_s *book),可以轻松访问book-&gt;paragraphs[1].strings[5] - 是一本书第一段中的5个字符串。
  • 如果作业应该对所有其他函数可见并且您想要创建作业数组,只需将作业数组设为全局即可。
  • @KamilCuk 使用结构而不是字符串矩阵?还是作为字符串数组的一部分?请将此评论放在单独的答案中,使其更具可读性。

标签: c arrays string matrix


【解决方案1】:

数组索引运算符[] 的优先级高于取消引用运算符*。所以*jobs[*i][0] 并没有做你认为的那样。

此外,当您将字符串常量分配给矩阵的元素时,您将覆盖指向您分配的内存的指针,从而导致内存泄漏。

需要在*jobs周围加上括号,复制字符串需要使用strcpy

 strcpy((*jobs)[*i][0], "hello");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2021-12-23
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多