char指针的内存分配

时间:2018-08-02 15:40:19

标签: c string pointers dynamic-memory-allocation

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

还有什么正确的方法:

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

3 个答案:

答案 0 :(得分:3)

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

考虑您的内存分配语句:

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() 及其家族。

答案 1 :(得分:1)

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

a=malloc(1024);

第二,scanf仅在您使用“%s”时才读取下一个空格。也不受a中可用空间的限制。阅读整行文本的一种更好的方法是像这样使用fgets

fgets(a,1024,stdin);

这将最多读取1023个字符或最多(包括下一个换行符)。它将同样为您终止字符串。

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

printf("%s",a);

答案 2 :(得分:0)

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(),如果不使用它,则会出现内存泄漏问题。