在通过C中的值传递字符串的多个示例之后,我仍然不明白为什么以下代码不起作用
int main(void){
char *fileList;
strcpy(fileList,"This is a test line\n");
char type = 'F';
if(checkFileList(fileList, type)){
printf("Proper File list\n");
}
else{
printf("Improper File list\n");
}
}
int checkFileList(char *string, char type){
// Do something with string
}
如果我在主函数中将变量fileList定义为 -
,则此程序有效char fileList[128];
但我无法为此字符串提供固定大小,因为我只在运行时获取字符串,因此不知道它会持续多长时间。
我在这里做错了什么?请注意,我不想通过引用传递字符串,因为我将更改函数中的字符串,并且不希望它反映在原始字符串中。
答案 0 :(得分:3)
在您的代码中
char *fileList;
strcpy(fileList,"This is a test line\n");
调用undefined behaviour
因为,fileList
未经初始化使用。
在使用之前,您需要将内存分配给fileList
。也许malloc()
和一系列功能将帮助您实现这一目标。另请阅读free()
。
FWIW,
如果我在主函数中定义变量fileList,则该程序有效
char fileList[128];
因为,fileList
是一个数组,内存分配已由编译器完成。所以,可以使用它。
BTW "按值传递字符串" 是滥用条款。 C对任何传递的函数参数使用pass-by-value。
答案 1 :(得分:0)
为了在运行时为字符串分配内存,最好先了解字符串的大小:
int main(void){
const char *str = "This is a test line\n";
int len = strlen(str);
char *fileList = malloc(len);
// then later you also have to take care for releasing the allocated memory:
free(fileList);
}