0
int main(){
    char *ptr = (char*)malloc(10);
    printf("%d",strlen(ptr));
}

Output is 11. i did not get why it is like that?

4

4 回答 4

7

您尚未将任何数据写入 malloc'ed 块。它里面有旧字节,没有办法知道它包含什么。 strlen只是寻找下一个零字节。我猜你在 11 字节之外找到了一个,但它可能在数千字节之外。

您正在查看未定义的行为。

于 2012-02-17T18:47:22.910 回答
0

您正在分配 10 个字节的内存来存储垃圾。请记住,strlen() 会一直读取直到\0找到 a。

理想情况下,在分配一个新块后,您将执行:memset(ptr, 0, 10);

于 2012-02-17T18:48:21.007 回答
0

您的代码返回 11,但这只是巧合。一般来说,你会得到未定义的行为。

问题是在 C 字符串中是空终止的。这意味着 \0 字符表示字符串的结尾。

int main(){
    char *ptr = (char*)malloc(11);
    ptr[10]=0;
    printf("%d",strlen(ptr));
}

这将返回一个值 <= 10。总是。

于 2012-02-17T18:48:25.483 回答
0

做这个:

int main(){ 
    char *ptr = (char*)malloc(10); 
    memcpy(ptr,0,10); 
    printf("%d",strlen(ptr)); 
}
于 2012-02-17T18:50:34.430 回答