2011-07-03 67 views
2
int main() { 


    char **k; 
    char *s ="abc"; 
    char *b ="def"; 

    *k = s; 


} 

//为什么会产生分段错误?不是所有的东西都不会在没有任何问题的情况下存储次要内存分配问题C++

+1

你认为'* k'应该是什么? 'k'指向什么? – Cascabel

回答

4

k尚未定义值,因此解除引用(*k)会导致未定义的行为。如果添加初始化,即k = &b;,*k = s;将在事后工作。

+1

所以char * s自动定义了值?什么是使用k的正确方法? – Mark

+2

@Mark:你可以说'k =&s'。 –

+0

不,但你初始化's'和'k'使它们有一个有效值。请记住,取消引用指针意味着*读取指针的值,将其视为内存地址并访问此内存地址*。如果'k'没有初始值,'* k'基本上读取'k'中任意位模式指向的任何位置。 –

1

Alexander is correct,您正在取消k*k = s;char *s="abc";的初始化可能看起来是一样的,但它的语法糖时间更长:char *s; s="abc";

2

好的,我希望我不会被任何轻微的错误殴打......这是我试图解释为尽我所能。

用普通的char *它会指向一个char。

用char **它指向一个指向char的指针。 * k值在堆上而不是堆栈上。

即是这样的:

stack (1) heap (2) heap or ... (3) 
+-----+ +-----+  +----+ 
|char*| -> |char*| -> |char| 
+-----+ +-----+  +----+ 

现在字符*的是不是真的字符串但是它们被视为是由一个空值或零字节结束在存储器的连续的可打印字符的块。所以字符串将被存储并在(3)

中被引用所以要修复你的代码,你需要为char *(不是char)分配空间。

即把

k = (char**)malloc(sizeof(char*)); 

前行

*k = s; 

不,这是一个很好的代码,但它不应该崩溃。

+0

哎呀,让我纠正一下。 – Matt

+0

哦,是的,现在很清楚:)谢谢! – sarnold