1

我正在制作一个连接用户给出的两个字符串的程序。一切都很好,但我不知道为什么程序显示最终结果的sizeof是 8 位长。不管字符串有多长,它总是显示 8。我猜,它是char的大小,但我想知道它为什么会这样。这是代码:

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

char* concatenate(char *fir, char *sec)
{
int firLen = strlen(fir);
int secLen = strlen(sec);
int len = firLen + secLen + 1;
int i = 0,c=0;
int *wsk = &i;

char *result = (char *)malloc(len*sizeof(char));

while (fir[i]!='\0')
{
    result[i]=fir[i];
    (*wsk)++;
}

while (sec[c]!='\0')
{
    result[i]=sec[c];
    (*wsk)++;
    c++;
}

result[len-1] = '\0';
return result;
}

int main(int argc, char **argv)
{
char *first, *second, *output;
int size1, size2;

printf("How long will your first string be: ");
scanf("%d", &size1);

first = (char *) malloc ((1+size1)*sizeof(char));
if (!first)
{
    puts("\nError. Can't allocate memory!");
    abort();
}

printf("How long will your second string be: ");
scanf("%d", &size2);

second = (char *) malloc ((size2+1)*sizeof(char));
if (!second)
{
    puts("\nError. Can't allocate memory!");
    abort();
}

printf("\nPlease, type in the first string: ");
scanf("%s",first);

printf("\nPlease, type in the second string: ");
scanf("%s",second);

output = (char *)malloc((size1+size2+1)*sizeof(char));
output = concatenate(first, second);

printf("\nConcatenation of the strings: %s", output);
printf("\n%d", sizeof(output));

free(first);
free(second);
free(output);

getchar();
return 0;
}
4

4 回答 4

6

不要使用sizeof来确定字符串长度,请使用该strlen函数,就像您在程序的其他部分中所做的那样。

printf("\nConcatenation of the strings: %s", output);
printf("\n%d", strlen(output));

用于sizeof确定数据类型的大小,如char、a struct、数组等。

你已经提到你想用它sizeof检查内存分配是否一切正常,但是你不能sizeof在分配的内存缓冲区上使用这种方式malloc:你只能依赖malloc- 你不是检查 - 了解您的分配是否成功。

可以使用sizeof来确定数组的大小:

char myStr[13];
printf("%d\n", sizeof(myStr));

但这仅适用于数组,不适用于使用malloc.

此行还会造成内存泄漏,因为您覆盖了下一行中的指针:

output = (char *)malloc((size1+size2+1)*sizeof(char));
于 2012-10-10T15:04:56.900 回答
2

sizeof以字节为单位给出大小,其中一个字节是 a 的大小char

printf("\n%d", sizeof(output));

output是 a char*,所以在你的系统上char*s 有 8 个字节大。您必须使用strlen来获取以 0 结尾的字符串的长度。

于 2012-10-10T15:05:13.493 回答
1

printf("\n%d", sizeof(output));打印指向 的指针大小char。您的平台似乎有 8 个字节大小的指针。

于 2012-10-10T15:05:18.747 回答
0

第一的:

second = (char *) malloc ((size2+1)*sizeof(char)); 

不要对malloc().

第二: sizeof(char)将是 1,一个 char 是 1 个字节,并sizeof()返回保存该数据类型所需的字节数。所以你不需要*sizeof(char),你需要更大的类型,比如int.

最后:

printf("\nConcatenation of the strings: %s", output);    printf("\n%d", sizeof(output)); 

output是一个char *所以这会给你sizeof(char *)在你的系统上。

你在之前的评论中说: I know the differences between strlen and sizeof, but using sizeof(output) I wanted to check if everything is fine with memory allocation

听起来您想要的是验证您是否为两个连接的字符串分配了正确的内存量。sizeof()不会给你这些信息。此时处于低级细节中,您需要做一些依赖于操作系统的操作来尝试查找该信息。(例如,在 linux 内核中,如果你有kmalloc()记忆,你可以用ksize()它来准确找出你得到了多少字节)

于 2012-10-10T15:20:35.560 回答