关于在C中指定char指针的麻烦

时间:2014-04-29 10:57:20

标签: c string malloc

我有一个关于指定char指针和malloc的简单C程序,如此

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char str[] = "0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789";
    char* str1 = malloc(sizeof(char*));
    strcpy(str1, str);
    printf("%s\n\n", str1);

    char* str2 = malloc(sizeof(char*));
    str2 = str1;    
    printf("%s\n", str2);

    return 0;
}

结果是:

0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789

0123456789 0123456789 01!

那么为什么str2只能从str1获得25个字符?那里的“!” (在str2的最后)来自?

你可以帮帮我吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

你没有足够的空间。 sizeof(char *)是保存指针所需的内存量(与指针指向的位置无关)。

将mallocs更改为:malloc(sizeof str)malloc(strlen(str) + 1)

此外,str2 = str1会导致内存泄漏。它使指针str2指向str1指向的位置,然后你就拥有那个没有任何指向它的malloc&#d; d块。

在原始代码中,当你写入你不拥有的记忆时,任何事情都可能发生;尝试调查为什么你得到一些特定的垃圾而不是其他一些特殊的垃圾并不是真的有用。

答案 1 :(得分:1)

你的sizeof错了,你是malloc - 4或8个字节,根据你的指针大小,你应该malloc(sizeof(str),因为那是你要复制到它里面的东西

另请注意,str2 = str1只会覆盖str2指针,因此您的内容会出现内存泄漏,因为malloc初始化中的str2会丢失。