提问人:kostas791 提问时间:12/9/2022 最后编辑:Lundinkostas791 更新时间:12/9/2022 访问量:54
如果您不使用 malloc 为 \0 分配空间怎么办?
What if you dont allocate room for \0 using malloc?
问:
据我所知,我应该在第 14 行中像这样分配内存:我没有添加 1,但代码仍然完美。我不能让它崩溃,返回任何超过 0 的东西。那么,是否需要 +1?如果是这样,由于我的程序运行顺利,后果会是什么?array[i]=malloc(sizeof(char)*(strlen(buffer)+1));
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 5
#define SIZE 512
int main(){
char *array[N];
char buffer[SIZE];
int i,j;
for(i=0;i<N;i++){
printf("Give word no.%d",i+1);
gets(buffer);
array[i]=malloc(sizeof(char)*strlen(buffer));
printf("%d",strlen(buffer));
if(!array[i]){
printf("Program will now exit.");
exit(0);
};
strcpy(array[i],buffer);
}
尝试了 +1 和没有。相同的结果,尽管我在教程中看到它是必需的。
答:
3赞
Lundin
12/9/2022
#1
需要 +1 来为 null 终止符分配空间。如果不这样做,则可能会越界写入分配的数组,这是未定义的行为。什么是未定义的行为,它是如何工作的?这意味着它可能看起来工作得很好,以后会神秘地打破。
sizeof(char)
根据定义,始终为 1,因此不需要该部分。
建议:使用array[i] = malloc(strlen(buffer) + 1);
顺便说一句,无论谁(书/老师)告诉你使用,都应该退休,而不是用作学习 C 编程的来源。为什么 gets 函数如此危险,以至于不应该使用它?gets
评论
0赞
pmacfarlane
12/9/2022
还会推荐 strdup(),它更易于使用,这意味着您甚至不必考虑添加 1。
0赞
Lundin
12/9/2022
@pmacfarlane在 C23 上线之前,我不会推荐它:)
评论
gets
gets(buffer);
--> 为什么 gets 函数如此危险,以至于不应该使用它?printf("%d",strlen(buffer));
printf("%zu",strlen(buffer));