C 不在if语句外打印
我正在制作我自己的make版本。我允许通过命令行传递一些参数 我正在分块做这件事。我正在设置文件名 我有以下代码C 不在if语句外打印,c,arrays,string,pointers,C,Arrays,String,Pointers,我正在制作我自己的make版本。我允许通过命令行传递一些参数 我正在分块做这件事。我正在设置文件名 我有以下代码 int main(int argc, char *argv[]) { char *fileName = NULL; char fileFlag[2]; strcpy(fileFlag, "-f"); printf("%s\n", fileFlag); if (argc == 1) { fileName = (char *) m
int main(int argc, char *argv[]) {
char *fileName = NULL;
char fileFlag[2];
strcpy(fileFlag, "-f");
printf("%s\n", fileFlag);
if (argc == 1) {
fileName = (char *) malloc(sizeof("Makefile"));
strcpy(fileName, "Makefile");
printf("One arg %s\n", fileName);
}
printf("\n%s", fileName);
return 0;
}
当它运行时,我得到以下输出
-f
One arg Makefile
它不应该打印另一行吗?第一个问题是
strcpy(fileFlag, "-f");
fileFlag
缺少所需空间的一个元素,您需要有3个元素数组来存储“-f”
以及终止null。在这种情况下,根据strcpy()
行为
strcpy
函数复制由s2
指向的字符串(包括终止null
字符)插入到由s1
指向的数组中。[……]
因此,包括空字符,源的大小是3,因此目标也需要。否则,您将访问调用的绑定外内存
也就是说
- 在使用返回的指针之前,请始终检查
是否成功malloc()
- 第一个问题是
strcpy(fileFlag, "-f");
fileFlag
缺少所需空间的一个元素,您需要有3个元素数组来存储“-f”
以及终止null。在这种情况下,根据strcpy()
行为
strcpy
函数复制由s2
指向的字符串(包括终止null
字符)插入到由s1
指向的数组中。[……]
因此,包括空字符,源的大小是3,因此目标也需要。否则,您将访问调用的绑定外内存
也就是说
- 在使用返回的指针之前,请始终检查
是否成功malloc()
fileFlag
不够大,无法容纳两个字符和一个nul终止符。很抱歉,sizeof(“Makefile”)
是错误的。。。令人惊讶的是,它返回的是字符串的长度,包括终止符。但我想知道为什么在这种情况下字符串文字会被解释为数组…@EugeneSh。从6.4.5字符串文字开始:“然后使用多字节字符序列初始化静态存储持续时间和长度刚好足以包含该序列的数组”,从6.5.3.4开始,使用sizeof和_Alignof运算符:“当应用于具有数组类型的操作数时,结果是数组中的总字节数。”请注意,如果argc!=1
,代码尝试printf(“\n%s”,NULL)
fileFlag
不够大,无法容纳两个字符和一个nul终止符。很抱歉,sizeof(“Makefile”)
是错误的。。。令人惊讶的是,它返回的是字符串的长度,包括终止符。但我想知道为什么在这种情况下字符串文字会被解释为数组…@EugeneSh。从6.4.5字符串文字开始:“然后使用多字节字符序列初始化静态存储持续时间和长度刚好足以包含该序列的数组”,从6.5.3.4开始,使用sizeof和_Alignof运算符:“当应用于具有数组类型的操作数时,结果是数组中的总字节数。”请注意,如果argc!=1
,代码尝试printf(“\n%s”,NULL)代码>@EugeneSh。等等,你的意思是说它不是指向文本的指针?令人惊讶的是,它返回的是字符串的长度。@EugeneSh。好的,是sizeof
不会导致衰变。根据定义,字符串文字是char类型的数组,就是这样。我想这就是解释。@EugeneSh。等等,你的意思是说它不是指向文本的指针?令人惊讶的是,它返回的是字符串的长度。@EugeneSh。好的,是sizeof
不会导致衰变。根据定义,字符串文字是char类型的数组,就是这样。我想这就是解释。