【问题标题】:Dynamic Memory allocation to string, gives out incorrect size [duplicate]为字符串分配动态内存,给出不正确的大小[重复]
【发布时间】:2017-02-26 11:39:51
【问题描述】:

我尝试为字符串动态分配内存,但是当我打印出大小时,它显示的是 4 而不是应该分配的 (11+1) 字节。为什么会这样?字符串打印出来就好了。

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

int main(){
char c, *string;
int i=0, a=1;

printf("\nEnter the string : ");

string = (char *) malloc (sizeof(char));
while(c != '\n'){
    c = getchar();

    string = (char *) realloc (string, sizeof(char) * a);

    string[i] = c;

    a++, i++;
}
string[i] = '\0';

puts(string);

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

}

Input  : Sample Text
Output : 
    Sample Text
    4

【问题讨论】:

  • 使用strlen(string)而不是sizeof(string),后者提供了保存指向char的指针所需的内存。此外,从strlen 返回或由sizeof 给出的数字的正确格式说明符是%zu
  • 一些事情:首先请阅读this discussion about casting malloc (and friends)。其次,当使用realloc 时,不要直接赋值给你传递给函数的指针,想想如果realloc 返回一个空指针会发生什么。第三,您不为终结者分配空间。第四,用终止符覆盖最后一个字符。
  • 错误:string[i] = '\0'; 但是string+i 不存在(没有为其分配存储空间)。

标签: c sizeof dynamic-memory-allocation


【解决方案1】:

sizeof 为您提供 char 指针的大小,在您的平台上为 4。

【讨论】:

    【解决方案2】:

    sizeof 运算符返回变量的“大小”,在本例中是一个指针。在 32 位系统上,指针是 4 个字节,所以这就是打印的内容。您想使用strlen(char*) 函数,该函数查看包含指针指向的字符串的内存。此函数将计算它看到的字节数,直到最后一个 0 终止符字节。

    【讨论】:

      猜你喜欢
      • 2021-05-06
      • 1970-01-01
      • 2018-03-18
      • 2020-04-13
      • 2018-06-16
      • 2019-09-06
      • 1970-01-01
      • 2021-01-11
      • 2020-11-28
      相关资源
      最近更新 更多