malloc返回的字符串大小不正确

时间:2015-01-03 22:26:44

标签: c

以下代码中为什么以下分配的字符串(即result)的大小不正确

#include <stdlib.h>


char *concat(const char *s1, const char *s2)
{
    char *result;

    result = malloc( strlen(s1) + strlen(s2) + 1 );

    printf("%d", sizeof(result)); // <-- ????? ( it should be seven)

    if ( result == NULL ){
        printf("Error: malloc failed in concat\n");
        exit(EXIT_FAILURE);
    }

    strcpy(result, s1);
    strcpy(result, s2);


    return result;
}

int main()
{
    char *p;
    p = concat("abc", "def");

    return 0;
}

编辑: 我试图为新字符串分配足够的大小,但不知何时大小不正确。

2 个答案:

答案 0 :(得分:3)

在这种情况下,sizeof在编译时进行评估,并且不关注已分配块的大小。

表达式返回指针的大小,这对于硬件平台是固定的。

不幸的是,找不到malloc返回的分配大小。如果您想知道已分配块的大小,则需要将大小存储在单独的变量中。

答案 1 :(得分:2)

sizeof(result)会给出指针大小48,因此您无法使用它。

在调用malloc后,您应该立即检查它的返回值,如果错误,则返回NULL,如果该值不是NULL则会指向未初始化的内容。

要获取字符串的长度,您需要strlen函数,但如果内容未初始化,则将是未定义的行为。

在用数据填充缓冲区后需要使用strlen,数据以'\0'字节终止,该字节标记字符串的结尾,如果你没有,它就不会存在t初始化数据。