2016-11-30 41 views
-6
字符串

例1: 当我走串输入,它成功地给出了输出,写这一段代码:的printf的意外的输出在C

#include <stdio.h> 
int main() 
{ 
    char *str; 
    scanf("%s",&str); 
    printf("%s",&str); 
    return 0; 
} 

情况2: 。另一方面,它抛出一个运行时错误的这个片段:

#include <stdio.h> 
int main() 
{ 
    char *str; 
    scanf("%s",&str); 
    printf("%s",str); 
    return 0; 
} 

我发现这个奇特的东西,想知道为什么会发生? 在此先感谢。

+5

阅读** **字符串,** **指针,数组** **和**动态内存分配**以及**格式说明**。通过阅读关于*未定义的行为*,在蛋糕上添加樱桃。 – haccks

+1

这里的东西缺少记忆,那就是'str'。 –

+0

除了你没有为'str'分配内存,情况2是正确的实现。在使用之前添加一个'str = malloc(50);'或类似的东西。在情况1中你幸运,只是爆炸一些不属于你的记忆。 – eddiem

回答

2

这两种情况都不是正确的。

案例1只工作,因为你有幸运,可能通过给一个字符串作为输入。试试类似"bfjabfabjkbfjkasjkvasjkvjksbkjafbskjbfakbsjfbjasbfjasbfkjabsjfkbaksbfjasbfkja",你很可能会遭遇seg故障。

您应该有一个与str关联的内存块,或者在堆栈上为它声明一个数组,或者在堆上为它存储内存块malloc

而且您不应该使用&运算符。

因此,这将是这样的:

#include <stdio.h> 
int main() 
{ 
    char str[50]; // 50 is arbitrary 
    scanf("%s",str); 
    printf("%s",str); 
    return 0; 
} 

或像这样:

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    char* str = malloc(50); // 50 is arbitrary 
    scanf("%s",str); 
    printf("%s",str); 
    free(str); 
    return 0; 
} 
+0

非常感谢@YuriLaguardia –

+0

@yano哎呀。绝对! – yLaguardia

+0

对不起@yano。我是StackOverflow的新手,所以不太习惯它。我感谢你与我分享正确的代码:) –