2017-04-07 100 views
-4
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main(void) 
{ 
    char *p ; 
    char *q ; 
    char *l = "aaaaaasdfsfdqwecvxcxfwdsagfd" ; 
    p = (char*)malloc(sizeof(l)) ; 
    q = (char*)malloc(strlen(l)) ; 
    strcpy(p, l) ; 
    strcpy(q, l) ; 
    printf("%s\n",p) ; 
    printf("%s\n",q) ; 
    printf("%d\n",strlen(l)) ; 
    return 0 ; 
} 

请看看这个,在23个字符内输入一些字符的时候,没问题,输入的字符超过23个,就像图片显示的那样,我的结果显示乱码,为什么会这样? enter image description herec sizeof()会导致溢出?

+5

不要将代码作为图像发布,这太可怕了。而你没有分配足够的内存,缺少null-termination字符。可能是这个问题,但现在我必须进行眼科手术,所以你会原谅我。 –

+1

我很抱歉,这是我第一次问stackoverflow问题,我会解决它。谢谢。我不认为插件空终止字符在这里工作,它已经存在了 –

回答

3

当你在指针上做sizeof时,你会得到指针的大小而不是它指向的内存。这通常是4或8,具体取决于您是在32位还是64位系统上。

然后strlen返回字符串的长度而不是空终止符。

这两种尺寸都是很小以容纳带终止符的完整字符串,导致未定义行为strcpy调用超出界限时。

+0

我明白了!谢谢。 –

+0

但我仍然有一个问题,当我对指针做sizeof时,我得到一个4字节的mem,而我输入的字符串超过4个字符,实际上它有23个字节,所以为什么我可以得到4个以上的正确字符输出? –

+0

@LiuYikai为了得到正确的字符串长度,你应该使用'strlen'。要获得包含*终止符的字符串*的长度,可以在'strlen'返回的长度上添加一个(例如,在您的示例中为'strlen(l)+ 1') –