这段代码中字符串的大小会怎样?

时间:2016-08-06 21:28:35

标签: c dynamic malloc fgets

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


int main()
{
int size=10;
char string1[50];       
char *string2;
string2=(char *)malloc(size*sizeof(char));

fgets(string1,10,stdin);
printf("%s",string1);

fgets(string2,10,stdin);
printf("%s",string2);

}

此代码中有两个字符串,一个是数组,另一个是使用指针动态创建的。

  1. 如果我对string1的输入小于50,而string2的输入小于10,那么未填充的空间将被浪费,如果是,则如何减小大小。
  2. 如果字符串2 malloc size参数为10且fgets size参数为10,如果我将大小增加到大于malloc的大小的fgets(string2,50,stdin)会发生什么?
  3. 如何计算每种情况下输入字符串的最终大小?我使用了sizeof运算符,但它给出了string1和string2分别为50和10的硬编码大小
  4. 还有其他更好的方法来创建动态字符串吗?

1 个答案:

答案 0 :(得分:1)

  1. 是的,会浪费。您可以使用可变长度数组来使用不同的限制,或使用动态分配。你是否应该担心浪费的空间是一个单独的问题:如果你的程序读取用户手动输入的字符串(而不是读取文件),你可以在它开始重要之前浪费大量空间,除非你在具有严重内存限制的嵌入式系统。
  2. 您将获得未定义的行为,因此您的程序将无效。不要这样做 - 这正是fgets占用字符串最大长度的原因。
  3. 调用strlen计算字符串的长度。为null终止符添加1。请注意,当您使用'\n'并且输入中包含fgets时,'\n'是字符串的一部分。
  4. 您可以将POSIX扩展名用于scanf,并将%ms格式和指针传递给char*。这将以确切的长度分配字符串,但您的程序将不那么便携。显然,您需要释放这些字符串以避免内存泄漏。