<分区>
我想我知道自己问题的答案,但我想确认我完全理解这个问题。
我写了一个返回字符串的函数。我传递一个 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
。
我说得对吗?