【问题标题】:char*** causes segfault after one run of for loopchar*** 在运行一次 for 循环后导致段错误
【发布时间】:2021-11-10 23:29:33
【问题描述】:

我正在尝试从 C 中的函数访问和操作字符串列表,但由于某种原因,一旦函数中的循环通过 1 次,我就会遇到 seg 错误。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void print_stuff(char*** what)
{
    for(int i = 0; i < sizeof(*what); ++i)
    {
        *what[i] = malloc(5 * sizeof(*what));
        *what[i] = "hello";
        printf("%s\n", *what[i]);
    }
}

int main(void)
{
    char** hello;
    hello = malloc(20 * sizeof(*hello));
    print_stuff(&hello);
}

【问题讨论】:

  • 这一行:*what[i] = "hello"; 可能没有做你认为它正在做的事情。研究strcpy.
  • sizeof(*what) 不是数组的长度,而是指针变量需要多少字节(在 64 位系统上为 8)
  • 这个问题的答案可能会有所帮助:Triple pointers in C: is it a matter of style?
  • 在极少数情况下,您实际上需要 C 语言中的 ***。这可能不是其中之一。您使用*** 是因为您认为您需要它,还是试图通过插入和删除* 来消除警告?您可能应该找到一本好书或教程,并阅读有关指针和数组如何工作的信息。另外我建议在其他地方创建数组,而不是在名为“print_stuff”的函数内。

标签: c pointers malloc dynamic-memory-allocation


【解决方案1】:

我打算写一个长而详细的答案,但考虑到我能想到的关于这段代码的问题数量,它太长了。所以这里是简短的版本。看起来您正在尝试做的事情可以像这样完成。

#include <stdio.h>

int main(void)
{
    for(int i = 0; i < 20; i++) {
        printf("hello\n");
    }
}

我无法理解其余代码的用途。它无用地分配内存,甚至没有正确地分配内存。这是错误的。您想要实现的目标可能需要更多背景信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2014-12-07
    • 2023-03-24
    相关资源
    最近更新 更多