如果以前有人回答过这个问题,我很抱歉,但我一直在疯狂地寻找答案。我一直在使用malloc创建一个数组:
char *message = (char*) malloc(31 *sizeof(char));
要让用户输入最多30个字符的消息:
fgets(message, 30, stdin);
在另一个函数中,我尝试将消息转换为小写,并将其存储在另一字符串中(希望长度与消息相同)。
int length_message = strlen(message) - 1;
char *temp1 = (char*) malloc(length_message * sizeof(char));
for(int i=0; message[i] != ' '; i++)
{
temp1[i] = tolower(message[i]);
}
但是当我显示新字符串时
puts(temp1);
它显示了我的输入信息,然后在一行新行上显示了一大堆胡言乱语。我不明白这是从哪里来的。
此外,在检查我的temp1数组的长度和我为长度消息创建的值时,使用:
printf("length of temp array: %d", strlen(temp1));
printf("length of message: %dn", length_message);
它返回了所需的length_message(用户在消息中输入的字符数),但我的临时数组的长度是错误的!我是否错误地为临时数组分配了内存,或者没有正确写入该数组?
从我在其他线程上读到的内容来看,我似乎有一个缓冲区溢出错误?我该如何控制?
提前感谢!
这:
strlen(message) - 1
当然应该是这样的:
strlen(message) + 1
你错别字了。
您的代码有几个问题。
实际错误是由于没有将终止的0字符从源字符串复制到目标字符串。您需要在for循环之后编写一个temp[i] = 0;
。
此外,确实存在缓冲区溢出的可能性,因为复制的malloc()
比字符串的长度少一个字符。(为什么…?您应该再分配一个…)
进一步的问题包括void *
的可怕的强制转换、冗余的(因此不安全的)sizeof(char)
以及硬编码的缓冲区大小。
代替
char *message = (char*) malloc(31 *sizeof(char));
尝试
#define BUF_SIZE 31
char *message = malloc(BUF_SIZE);
fgets(message, BUF_SIZE, stdin);
或者如果你觉得迂腐,那么
char *message = malloc(BUF_SIZE * sizeof message[0]);
但当您是malloc()
内存时,永远不要在sizeof()
中使用硬编码类型。但无论如何,我认为你根本不需要malloc()
。为什么不使用自动数组(一个"堆栈分配"的数组,尽管这不是它的正确名称)?然后,在获取用户输入时可以利用sizeof
运算符。
此外,strlen()
和其他几个stdlib函数返回size_t
。您绝对应该使用该类型而不是int
。