【问题标题】:malloc() behavior in C [duplicate]C中的malloc()行为[重复]
【发布时间】:2017-01-22 23:34:43
【问题描述】:

对于下面的 C 代码,当我只输入一个字符时,我希望最后一个 printf 打印“10,10”。相反,它打印“10,8”。为什么我 malloc 10 个字节时input 只有 8 个字节?

char* input;
unsigned long inputLen = 10;

input = (char*) malloc(10 * sizeof(char));

printf("Input: ");
getline(&input,&inputLen,stdin);
printf("%lu,%d",inputLen,sizeof(input));

【问题讨论】:

  • 强制转换 malloc 不好 - 请参阅 stackoverflow.com/questions/605845/…
  • sizeof(char) - 这总是 1
  • getline() 函数在其返回值中报告读取了多少个字符。您应该使用它而不是其他任何东西来判断输入的长度。使用strlen() 通常会给出相同的答案,但用户可以在输入流中输入空字节(通常是Control-@),然后strlen() 会给出更短的答案。请注意,如果用户键入的字符数超过 9 个(包括换行符),则 inputLen 中的值可能会大得多。另外,getline() 的第二个参数应该是size_t *;这不一定与unsigned long 相同。
  • 就问题而言,您可以将代码简化为printf("%d", sizeof(char*));

标签: c malloc


【解决方案1】:

sizeof(input)返回指针input的大小,即8字节。

通过C FAQ

问:为什么sizeof 不告诉我指针指向的内存块的大小?

答:sizeof 告诉你指针的大小。没有可移植的方法来找出malloc'ed 块的大小。 (请记住,sizeof 在编译时运行,另请参阅question 7.27.

如果要跟踪input的容量,需要使用单独的变量,或者在堆栈上声明input为数组,用数组的大小除以个体的大小数组的元素。将容量保留为单独的变量几乎总是更容易。

【讨论】:

    【解决方案2】:

    为什么我 malloc 10 字节时只输入 8 字节?

    因为input 是一个指针,而指针在您的平台上是 8 个字节。 sizeof 函数只是告诉你类型的大小,在编译时确定。

    【讨论】:

      【解决方案3】:

      这是因为inputchar*。您应该考虑使用strlen,前提是您将其终止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 2012-06-06
        • 1970-01-01
        • 2017-05-13
        • 1970-01-01
        相关资源
        最近更新 更多