关于malloc():在已分配的内存之外写入

时间:2016-01-30 02:50:01

标签: 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,我仍然可以在数组[100]处打印该值。这不是我想要的,有没有更好的方法来动态分配和防止这个问题。如果我稍后在我的代码中犯了错误,我觉得这可能会导致溢出问题

3 个答案:

答案 0 :(得分:2)

在阅读或写作之前进行测试就可以了。在您的情况下 - 注意使用无效索引读取或写入数组会给出未定义的行为

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

但是,如果你没有明确做某事来确保索引有效(我用num > 100测试来说明,但还有其他方法可以做到),那么C中什么都没有防止对数组元素的无效访问 - 无论它们是否使用malloc()动态分配。

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

此外,您可能想要检查num是否为正,因为如果malloc()为零或为负,malloc()会产生意外结果。类似地,NULL如果失败则返回 import java.io.* ; import java.util.*; public class sd { public static void main(String[] argue) throws java.io.IOException { char incre = 97 ; File diction = new File("C:/Users/LoRd CuRZon/Desktop/dictionary/wordsEn.txt") ; PrintWriter alpha_list = new PrintWriter("C:/Users/LoRd CuRZon/Desktop/dictionary/a.txt") ; Scanner dictionary = new Scanner(diction) ; Scanner dictionarytemp = new Scanner(diction) ; while(dictionary.hasNextLine()) { if((char)incre != ((dictionarytemp.nextLine()).charAt(0))) { alpha_list.close(); incre++ ; alpha_list = new PrintWriter("C:/Users/LoRd CuRZon/Desktop/dictionary/" + (char)incre + ".txt" ) ; } alpha_list.println(dictionary.nextLine()); } alpha_list.close(); dictionary.close(); } } ,并且您应该在使用之前检查返回的指针,而不是依赖它有效。

答案 1 :(得分:1)

只需添加简单的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]已经是溢出并且可能导致未定义的行为 - 这不是很好的duh :)

答案 2 :(得分:0)

  

是否有更好的方法来动态分配和防止此问题

没有

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