以下两段代码中的 char *p 和 char p[] 有什么区别:
#include<stdio.h>
#include<string.h>
void main()
{
char source[]="stackflow";
char target[0];
strcpy(target,source);
printf("%s", target);
}
#include<stdio.h>
#include<string.h>
void main()
{
char source[]="stackflow";
char *target;
strcpy(target,source);
printf("%s", target);
}
为什么前者工作而信件不工作?
在此代码中,这并不重要,因为两个代码都调用了未定义的行为(UB)。
target
是一个长度为零的数组,你写在数组边界之外(它的长度为零)target
是一个未初始化的指针,你取消引用它调用UB。你需要定义一个足够大的数组或者分配足够的内存来容纳
source
字符串。
char target[strlen(source) + 1];
char *target = malloc(strlen(source) + 1);
当您将数组或指针传递给
strcpy
时,它们的行为相同,因为引用是按值传递的,而数组在表达式中衰减为指针。
为什么前者工作而信件不工作?
因为这是未定义行为的本质。 C 标准没有说明如果执行调用它的代码会发生什么。它可能会失败,也可能不会,格式化你的磁盘,将你的卡片详细信息发送给黑客或者其他东西