char* 会导致段错误,但 char[] 不会

标签 c string segmentation-fault

<分区>

我想我知道自己问题的答案,但我想确认我完全理解这个问题。

我写了一个返回字符串的函数。我传递一个 char* 作为参数,函数修改指针。

它工作正常,这是代码:

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

void get_file_name(char* file_name_out)
{
    char file_name[12+1];
    char dir_name[50+12+1];

    strcpy(file_name, "name.xml");
    strcpy(dir_name, "/home/user/foo/bar/");
    strcat(dir_name, file_name);

    strcpy(file_name_out, dir_name); // Clarity - equivalent to a return
}

int main()
{
    char file_name[100];

    get_file_name(file_name);
    printf(file_name);

    return 0;
}

但是如果我用 char *filename;char *filename = ""; 替换 char file_name[100];,我得到strcpy() 中的段错误。

我不知道为什么?

我的函数将 char* 作为参数,so does strcpy() .

As far as I understand , char *filename = ""; 创建一个只读字符串。 strcpy() 然后尝试写入只读变量,这是不允许的,因此错误是有道理的。

但是当我写 char *filename; 时会发生什么?我的猜测是在堆栈上分配了足够的空间来容纳指向 char 的指针,因此我只能在我的 file_name_out 指向的地方写入一个字符。调用 strcpy() 会尝试至少写入 2,因此会出现错误。

它将解释为什么以下代码编译并产生预期的输出:

void foo(char* a, char* b)
{
    *a = *b;
}

int main()
{
    char a = 'A', b = 'B';
    printf("a = %c, b = %c\n", a, b);
    foo(&a, &b);
    printf("a = %c, b = %c\n", a, b);
    return 0;
}

另一方面,如果我使用 char file_name[100];,我在堆栈上分配了足够的空间容纳 100 个字符,所以 strcpy() 可以愉快地写入进入 file_name_out

我说得对吗?

最佳答案

As far as I understand, char *filename = ""; creates a read-only string. strcpy() is then trying to write into a read-only variable, which is not allowed so the error makes sense.

是的,没错。它本质上不同于声明字符数组。初始化一个指向字符串文字的字符指针使其成为只读的;尝试更改字符串的内容会导致 UB。

But what happens when I write char *filename; ? My guess is that enough space to fit a pointer to a char is allocated on the stack, so I could write only one single character into my file_name_out variable.

您分配足够的空间来存储指向字符的指针,仅此而已。您不能写入*filename,甚至不能写入单个字符,因为您没有分配空间来存储*filename 指向的内容。如果要更改 filename 指向的内容,首先必须将其初始化为指向有效位置。

关于char* 会导致段错误,但 char[] 不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30300694/

相关文章:

c++ - 遍历数组时出现段错误

c++ - 调用基类变量时出现段错误

c++ - 在 n! 的最后查找零的个数

c - 如何在 C 函数中接收 char 数组?

Java 字符隔离字符串操作

string - COBOL:从字符串中删除某些字符

c - 添加到单链表末尾 段错误 C

c - 为什么我的程序打印的次数比预期多?

C++ Pin共享库 undefined symbol

就地for循环中的Python字符串连接?