谁能告诉我我的错误在哪里?此函数应该生成stdin
提供的字符数组。我读了一些相关的问题,但这对我来说太复杂了。
char *readChar(void)
{
int c;
int len = 0;
char* parr = malloc(sizeof(char));
while((c = getchar()) != EOF)
{
++len;
int size = sizeof(char)*len;
parr = (char *) realloc(parr,size);
*(parr+size-1) = (char) c;
printf("Done! Size should be: %dB, but real size is %dB\n",size,sizeof(parr));
}
return parr;
}
输出:
完成!尺寸应为:1B,但实际尺寸为8B 完成!尺寸应为:2B,但实际尺寸为8B 完成!尺寸应为:3B,但实际尺寸为8B 完成!尺寸应为:4B,但实际尺寸为8B
答案 0 :(得分:7)
错误是sizeof()
不会告诉您分配的字节数。它会告诉您char *
听起来你想要的是验证你分配了正确的内存量。 sizeof()
不会向您提供该信息。在这一点上,它处于低级别的细节中,您需要做一些依赖于OS的东西来尝试找到这些信息。 (例如,在Linux内核中,如果你kmalloc()
内存,你可以使用ksize()
来确切地知道你得到了多少字节数。
答案 1 :(得分:2)
sizeof(parr)
不是分配的空间量,它的大小为char*
(parr
的数据类型)。了解已分配的内存量的唯一可移植方法是自己跟踪它。
假设realloc
按预期工作,您分配的字节数将等于变量size
。
我在代码中注意到的其他一些事情:
char* parr = malloc(sizeof(char));
您应该始终检查malloc
的返回值,以确保它成功:
char* parr;
if(!(par = malloc(sizeof(char)))
{
//allocation failed
}
引起我注意的代码的下一部分:
int size = sizeof(char)*len;
实际上并不需要这样做。 sizeof(char)
总是等于一个字节,因此您也可以使用当前值len
,而不是在循环的每次迭代中声明一个等于len * 1
的新变量。
parr = (char *) realloc(parr,size);
如前所述,您不需要使用size
,因为它与len
相同。同样在C语言中,抛出指针通常不是一个好主意,你还应该检查realloc的返回值,如果它失败了:
if(!(parr = realloc(parr, size)))
{
//allocation failed
}
作为最后一点,我总是在使用realloc
函数时使用缓冲区来避免潜在的内存问题。以下是我的代码:
char *readChar(void)
{
int c, len = 0;
char* parr = NULL, char *tmp;
if(!(parr = malloc(sizeof(char)))
{
fputs("memory allocation failed", stderr);
exit(1);
}
while((c = getchar()) != EOF)
{
++len;
if(!(tmp = realloc(parr, len)))
{
free(parr);
fputs("memory allocation failed", stderr);
exit(1);
}
parr = tmp;
*(parr+len-1) = (char) c;
}
return parr;
}
答案 2 :(得分:1)
sizeof(parr)
返回指针大小(系统上为8个字节)。您需要使用strlen
来查找实际的字符串大小(注意,字符串应以\0
结尾,即以空值终止。)
答案 3 :(得分:1)
您无法使用sizeof()来测量动态分配的数组的大小,因为它是在编译期间进行评估的。在您的示例中,您正在使用指针的大小,这在x64架构上是8B。
答案 4 :(得分:1)
它为您提供sizeof
指针,每次打印时指针始终相同。
没有办法告诉指针指向的内存大小,你只需要自己跟踪它们。
顺便说一句,保证sizeof(char)
始终为1.所以您可以在致电realloc
和malloc
时将其删除。您还应该检查malloc和realloc的返回值,以确保安全。