1a)有这个代码
char *p;
p[0]='a';
p[1]='b';
printf("%s",p);
当我在ideone.com编译器:c ++ 4.3.2上运行此程序时,每次运行它都会显示“RUNTIME ERROR”。
1B)。但是,当我编辑此代码
时char *p;
//allocate memory using malloc
p[0]='a';
p[1]='b';
printf("%s",p);
正确运行并打印“ab”。不应该在结尾需要p [2] ='\ 0'吗?
2)
char *p;
p="abc"
printf("%s",p);
这正确运行并打印“abc”。为什么没有分配就可以工作。
任何人都可以解释有关字符串存储的规则吗?
答案 0 :(得分:4)
1a) 未定义的行为,因为您取消引用了未初始化的指针
1b) 未定义的行为,因为您使用printf
为非空终止字符串调用%s
2)工作正常:有分配,它只是一个字符串文字(你不能修改它,它存储在程序的只读部分:你因此原因应该声明const char*
注意:强>
在C ++中,使用std::string
和std::cout
。
答案 1 :(得分:2)
在第一个示例中,您声明指向char
的指针,然后将值分配给内存中的未定义位置。未定义,因为它是uninitialize p
指针指向的内容。您需要为序列分配内存(在C ++中使用new[]
,而不是malloc
)。如果你没有在结尾放置'\0'
,打印将在内存中遇到的前0处停止。
在第三个示例中,您声明指向char
的指针,并使用文字字符串"abc"
的地址初始化其值。它存储在可执行文件的(只读)数据部分中,并映射到进程地址空间。这是一个有效的指针,你的打印工作。
答案 2 :(得分:1)
1a)这里你没有分配内存,所以p指针指向一个随机位置,因此当你写出那个随机位置时会导致段错误
1b)如果使用malloc手动分配内存,它将正常工作。如果分配的内存包含0,则不必手动添加(但是你应该,因为你不能指望零填充)
2)在这里你将p指针指向字符串文字“abs”,因此它将指向它,并且分配由编译器完成