有人可以帮助我理解为什么我在下面的程序中遇到段错误

标签 c

请帮助我理解下面的代码,我的预期输出是“50”。当我从函数“f”返回指针“s”时,我能够得到此输出,并且在 main 中我需要进行此更改 s = f(s,i)。

void f(char *s,int i)
{
    s = (char*)malloc (20 *sizeof(char));
    s[i++]=50;
    s[i++]=53;
    return;
}

int main()
{
    int i = 10;
    char *s = NULL;
    f(s,i);
    printf(" s[%d]= %u \n",i,s[i]);
    free(s);
    return 0;
}

最佳答案

您不通过引用传递s

void f(char **s,int i)
{
    *s        = malloc(20 * sizeof(char));
    (*s)[i++] = 50;
    (*s)[i++] = 53;
}

int main()
{
    int i   = 10;
    char *s = NULL;
    f(&s,i);
    printf(" s[%d]= %u \n", i, s[i]);
    free(s);

    return 0;
}

问题是,在您的情况下,从 f(s, i); 返回后,在 main() 中变量 s 没有改变,因此仍然是NULL。然后崩溃发生在 printf(..., s[i]); 调用中。特别注意 free(s) 不会崩溃,因为 free can also be passed NULL .

关于有人可以帮助我理解为什么我在下面的程序中遇到段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42865069/

相关文章:

c - 对称加密 key 交换和存储?

c - 如何找到elf文件的节头字符串表的偏移量?

c - 尽管一切看起来都正确,但仍然得到 'curl/curl.h: No such file or directory'

c - 如何计算C中文本文件中的单词数

c - 如何返回带数组的 C 结构体?

c - 除十六进制数时的奇怪行为

c - 在尝试运行 C pthread 程序的命令行中出现权限被拒绝错误

c++ - 在Linux中,等效于在c/c++中打开物理驱动器的句柄并写入MBR的方法是什么?

c - C 中的方法重载

c - 检查 char* 指针是否为空终止字符串的便携方法