我正在制作一个程序,用于连接用户提供的两个字符串。一切都很好,但我不知道为什么程序显示最终结果的 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;
}
答案 0 :(得分:6)
请勿使用sizeof
来确定字符串长度,请使用strlen
函数,就像在程序的其他部分一样。
printf("\nConcatenation of the strings: %s", output);
printf("\n%d", strlen(output));
使用sizeof
确定数据类型的大小,例如char
,struct
,数组等。
您已经提到要使用sizeof
检查内存分配是否一切正常,但是您不能在缓冲区上使用sizeof
分配给malloc
的内存:您只能依赖malloc
的返回值 - 您没有检查 - 知道您的分配是否成功。
你可以使用sizeof
来确定数组的大小:
char myStr[13];
printf("%d\n", sizeof(myStr));
但这仅适用于数组,而不适用于使用malloc
分配的缓冲区。
此行还会因为覆盖下一行中的指针而产生内存泄漏:
output = (char *)malloc((size1+size2+1)*sizeof(char));
答案 1 :(得分:2)
sizeof
给出 bytes 中的大小,其中一个字节是char
的大小。
printf("\n%d", sizeof(output));
output
是char*
,因此系统char*
的大小为8个字节。您必须使用strlen
来获取以0结尾的字符串的长度。
答案 2 :(得分:1)
printf("\n%d", sizeof(output));
打印指向char
的指针大小。您的平台似乎有8个字节的指针。
答案 3 :(得分: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()
不会向您提供该信息。在这一点上,它处于低级别的细节中,您需要做一些依赖于OS的东西来尝试找到这些信息。 (例如在Linux内核中,如果你kmalloc()
内存,你可以使用ksize()
来确切地知道你得到了多少字节)