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,您应该在使用之前检查返回的指针,而不是依赖它是否有效。

只需添加简单的 If 语句。防止卵流。

if(num>100)
  array[100]=123;
  printf("%d",array[100]);
else
{
  // what else you want to be done
}

小心!数组始终从array[0]元素开始。因此,如果您分配ptrArray = malloc(sizeof(int)*100);它将分配一个从 0 到 99 的 100 个元素的数组。在此上下文中array[100]元素已经是溢出,并可能导致未定义的行为 - 这不是好:)

有没有更好的方法来动态分配和防止这个问题

不。

如果您不知道 100 是否是有效的索引,请不要写array[100]=

相关内容

  • 没有找到相关文章

最新更新