如果之前已经回答过,我很抱歉,但我一直在疯狂地寻找答案。我一直在使用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] != '\0'; i++)
{
temp1[i] = tolower(message[i]);
}
但是当我来显示新字符串
时puts(temp1);
它显示了我的输入消息,然后在新行上显示了一大堆乱码。我无法理解它的来源。
此外,在检查我的temp1数组的长度和我为长度消息创建的值时,使用:
printf("length of temp array: %d", strlen(temp1));
printf("length of message: %d\n", length_message);
返回了所需的length_message(用户在消息中输入的字符数)但是我的临时数组长度错误的数字!我是否错误地为临时阵列分配了内存,或者我没有正确地写入该阵列?
从我在其他线程上看到的内容,我似乎有一个缓冲区溢出错误?我该如何控制这个?
提前致谢!
答案 0 :(得分:3)
此:
strlen(message) - 1
当然应该是这样的:
strlen(message) + 1
你弄错了。
答案 1 :(得分:1)
您的代码存在一些问题。
实际错误是由于您没有将源字符串中的终止0字符复制到目标而引起的。你需要在for循环之后写一个temp[i] = 0;
。
此外,您确实有可能发生缓冲区溢出,因为复制的malloc()
字符比字符串的长度少sizeof(char)
。 ( 为什么......? 你应该分配一个更多 ...)
其他问题包括可怕的 casting of void *
,冗余(因而不安全)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]);
或者如果你觉得迂腐那么
sizeof()
但从不在malloc()
内存时使用malloc()
中的硬编码类型。但无论如何,我认为你根本不需要sizeof
。为什么不使用自动数组(“堆栈分配”,而不是它的正确名称)呢?然后,您可以在获取用户输入时利用strlen()
运算符。
此外,size_t
和其他几个stdlib函数返回int
。您绝对应该使用该类型而不是{{1}}。