c - 关于 malloc() : writing outside of allocated memory

标签 c malloc

我刚刚注意到这一点,想知道是否有办法防止它,

我从用户那里获取一个整数,然后使用该整数分配数组大小,如下所示:

int main(void){
    int num;
    int *array;
    printf("Enter num: ");
    scanf("%d",&num);
    array = malloc(sizeof(int)*num);
    array[100]=123
    printf("%d",array[100]);
}

如果在运行时输入 4 作为数字,我仍然可以打印 array[100] 处的值。这不是我想要的,有没有更好的方法来动态分配并防止这个问题。我觉得如果我以后在代码中犯了错误,这可能会导致溢出问题

最佳答案

在阅读或写作之前进行测试可以解决问题。在您的情况下 - 请注意使用无效索引读取或写入数组会产生未定义的行为

 if (num > 100)
 {
     array[100]=123;
     printf("%d",array[100]);
 }

但是,如果您没有明确执行某些操作来确保索引有效(我使用 num > 100 测试来说明,但还有其他方法可以做到这一点),那么C 中没有任何内容可以阻止对数组元素的无效访问 - 无论它们是否使用 malloc() 动态分配。

如果您希望为您提供这样的安全网(即您不想费心确保您使用的数组索引有效,并期望语言/编译器/主机来解决问题对于你来说)那么你将需要 C 以外的语言。

此外,您可能需要检查 num 是否为正数,因为如果它为零或负数,malloc() 将给出意外结果。同样,如果失败,malloc() 将返回 NULL,并且您应该在使用它之前检查返回的指针,而不是依赖它是否有效。

关于c - 关于 malloc() : writing outside of allocated memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35097415/

相关文章:

c - 段错误: 11 for C

c++ - malloc 分配的内存可以使用多少时间?

c# - 通过 TCP 套接字 c 发送二进制文件

c - 尝试从c中的文件中的单词(文本)中进行动态内存分配

c - 使用 malloc() 作为唯一指针

c - 在C中将信息存储到变量中的问题

CMake:选择编译器的正确方法,无需对其路径进行硬编码

在 C99+ 中结合指定的初始值设定项和 malloc?

无法在结构中声明二维动态数组

C数组内存分配