以下程序导致分段错误[我使用gcc作为编译器],如何在字符指针中打印str以及为什么分段错误?
#include <stdio.h>
#define LOW 0x40000000
#define HIGH 0x0
int main()
{
volatile char* str = (char*) (HIGH + LOW);
printf ( "Character Str:%s",str);
}
答案 0 :(得分:1)
您指定指针str
指向绝对存储器地址,存储器地址0x40000000
。 (char*)
强制转换是您的编译器没有抱怨的原因。几乎可以肯定的是,在该地址没有任何用处,因为除了那个指针之外你没有声明任何东除非您正在编写操作系统或正在编写没有虚拟内存的旧系统,否则不要使用绝对内存寻址。即便如此,如果你不知道自己在做什么,那也是个坏主意。
printf
失败,因为你告诉它查找从ptr
指向的内存开始的有效字符串并将其打印到stdout(例如你的控制台)。在极不可能的事件中,执行时进程可以读取地址0x40000000
并且它包含一个有效的以null结尾的字符串,它会在没有segfault的情况下打印出来。它仍然是胡言乱语。
根据您为HIGH
选择的数字,看起来您尝试使用null终止字符串。如果您想创建一个printf
可以打印的字符串,您可以尝试这样的事情:
char str[12] = "Hello World";
printf ( "Character Str:%s",str);
一旦正确分配了它,你就可以创建一个指针,如果你愿意,可以使用它。
char *strptr = str;
printf ( "Character StrPtr:%s",strptr);
我可能会偏离你实际上想要做的事情。但你所做的事情是无效的,你要做的事情并不明显。