在内存中存储字符指针

时间:2014-08-12 08:38:13

标签: c++ string character

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”。为什么没有分配就可以工作。

任何人都可以解释有关字符串存储的规则吗?

3 个答案:

答案 0 :(得分:4)

1a) 未定义的行为,因为您取消引用了未初始化的指针

1b) 未定义的行为,因为您使用printf为非空终止字符串调用%s

2)工作正常:有分配,它只是一个字符串文字(你不能修改它,它存储在程序的只读部分:你因此原因应该声明const char*

注意:

在C ++中,使用std::stringstd::cout

答案 1 :(得分:2)

在第一个示例中,您声明指向char的指针,然后将值分配给内存中的未定义位置。未定义,因为它是uninitialize p指针指向的内容。您需要为序列分配内存(在C ++中使用new[],而不是malloc)。如果你没有在结尾放置'\0',打印将在内存中遇到的前0处停止。

在第三个示例中,您声明指向char的指针,并使用文字字符串"abc"的地址初始化其值。它存储在可执行文件的(只读)数据部分中,并映射到进程地址空间。这是一个有效的指针,你的打印工作。

答案 2 :(得分:1)

1a)这里你没有分配内存,所以p指针指向一个随机位置,因此当你写出那个随机位置时会导致段错误

1b)如果使用malloc手动分配内存,它将正常工作。如果分配的内存包含0,则不必手动添加(但是你应该,因为你不能指望零填充)

2)在这里你将p指针指向字符串文字“abs”,因此它将指向它,并且分配由编译器完成