【发布时间】:2018-03-09 14:12:01
【问题描述】:
第一次在这里发帖,我已经使用这个网站多年,但这个困境真的很烦人。因此,当我使用 C 编译器通过 VS2015 开发人员命令提示符运行此 C 代码时:
#include <stdio.h>
#include <string.h>
int main(){
char* ptr = NULL;
const char* pt2 = "hello";
strcpy(&ptr, pt2);
printf("%s",&ptr);
return 0;
}
我收到以下警告:
midterm_c.c(35): warning C4047: 'function': 'char *' differs in levels of indirection from 'char **'
midterm_c.c(35): warning C4024: 'strcpy': different types for formal and actual parameter 1
midterm_c.c(36): warning C4477: 'printf' : format string '%s' requires an argument of type 'char *', but variadic argument 1 has type 'char **'
然而,当我运行它时,它会打印“hello”,这不应该发生,因为在 ptr 变量上使用引用运算符没有意义。但是当我在没有它们的情况下运行这段代码时:
char* ptr = NULL;
const char* ptr2 = "hello";
strcpy(ptr, ptr2);
printf("%s",ptr);
return 0;
我没有收到任何警告,编译成功,但是当我运行它时程序崩溃了,即使它应该可以正常工作。我真的很沮丧,因为这对我来说没有任何意义,也是我现在真的讨厌 C 的原因之一。如果有人知道这是如何发生的,我将不胜感激。谢谢。
【问题讨论】:
-
使用strdup(),它只是为ptr变量分配内存,然后将ptr2的内容复制进去。
-
'这应该可以正常工作' 为什么?您正在复制到一个空指针。
-
你没有为ptr分配内存。
-
'我没有收到警告,成功编译,但是当我运行它时程序崩溃' - 是的,这是未调试程序的正常行为。如果一个程序在第一次编译时运行良好,那就买彩票吧!
-
其实你是复制到一个空指针的地址。