【问题标题】:memory allocation for char pointerchar 指针的内存分配
【发布时间】:2019-01-10 10:57:42
【问题描述】:

我实际上应该动态存储string。我已经尝试了以下, 它正在打印所有内容,但只要我的输入中包含空格,它就会终止。谁能解释一下为什么?

还有什么是正确的做法:

int i;
char *a;
a=(char *)malloc(sizeof(char));
scanf("%s",a);
for(i=0;*(arr+i)!='\0';i++)
   printf("%c",*(arr+i));

【问题讨论】:

  • malloc(sizeof(char)) - 这要分配多少内存?
  • 您的分配有误。您只为 1 个字符分配空间!
  • 请包含整个代码
  • 你需要保存的最大字符串长度是多少?

标签: c string pointers dynamic-memory-allocation


【解决方案1】:

它正在打印所有内容,但它终止了......

考虑你的内存分配语句:

char *a;
a=(char *)malloc(sizeof(char));

通过仅将 sizeof(char) 字节分配给缓冲区 a,然后尝试向其写入空终止符以外的任何内容,您正在调用 undefined behavior。 (注意:C 中的sizeof(char) 始终等于1

C 字符串是 defined as a null terminated character array。您只分配了一个字节。唯一可能的合法 C 字符串是仅包含空终止字节的字符串。但是您的代码尝试编写更多内容,这样做会侵犯您的进程不拥有的内存位置。所以一般来说,在创建字符串时,遵循两个简单的规则:

  • 确定您需要的字符串max length
  • 将内存分配给max length + 1 字节以容纳终止字节。

例如,如果最大字符串为x 个字符长,则为x + 1 个字符创建内存:

char inputStr[] = {"This string is x char long"};
char string = malloc(strlen(inputStr) +1); //+1 for null byte
strcpy(string, inputStr);

注意,在 C 中它是 not recommended to cast the return of malloc() 和家族。

【讨论】:

    【解决方案2】:
    char *a;
    
    /* Initial memory allocation */
    a = (char *) malloc(1024);      //  your buffer size is 1024
    
    // do something with a
    
    free(a);
    

    在你的变量中复制下面的字符串,然后用"%s"作为字符串打印字符串,不需要使用"%c"

    strcpy(a, "this is a string");
    printf("String = %s", a);
    

    不要忘记使用free(),如果你不使用它会出现内存泄漏问题。

    【讨论】:

      【解决方案3】:

      您的代码有两个问题。首先,您只为 1 个字符分配了足够的空间,并且由于字符串必须以 NUL 结尾,因此您可以拥有的最长字符串是 0 个字符。由于您不知道要阅读多长时间的文本,因此您可以从任意大小(例如 1024)开始。

      a=malloc(1024);
      

      其次,当您使用“%s”时,scanf 只会读取到下一个空格。它也不受a 中可用空间的限制。阅读整行文本的更好方法是像这样使用fgets

      fgets(a,1024,stdin);
      

      这将读取最多 1023 个字符或最多并包括下一个换行符。它也会为你终止字符串。

      然后您可以将其打印为字符串。

      printf("%s",a);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-22
        • 1970-01-01
        • 2021-12-12
        • 2011-02-23
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多