如果您不使用 malloc 为 \0 分配空间怎么办?

What if you dont allocate room for \0 using malloc?

提问人:kostas791 提问时间:12/9/2022 最后编辑:Lundinkostas791 更新时间:12/9/2022 访问量:54

问:

据我所知,我应该在第 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 和没有。相同的结果,尽管我在教程中看到它是必需的。

c 字符串 malloc

评论

8赞 pmacfarlane 12/9/2022
忽略代码中的其他问题...是的,这是需要的。没有它就可以工作的事实只是运气,它迟早会破裂。
4赞 Harith 12/9/2022
无关:您正在使用 .它已经过时且危险,以至于它已从 C 中删除。gets
4赞 chux - Reinstate Monica 12/9/2022
gets(buffer); --> 为什么 gets 函数如此危险,以至于不应该使用它?
2赞 Harith 12/9/2022
如果你的编译器没有抱怨右大括号后面的杂散分号,你应该打开编译器警告。
2赞 chux - Reinstate Monica 12/9/2022
kostas791, -->以避免另一个问题。使用匹配说明符。printf("%d",strlen(buffer));printf("%zu",strlen(buffer));

答:

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 上线之前,我不会推荐它:)