我刚注意到这一点,并想知道是否有办法阻止它,
我从用户那里获取一个整数,然后使用整数来分配数组大小,如:
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]处打印该值。这不是我想要的,有没有更好的方法来动态分配和防止这个问题。如果我稍后在我的代码中犯了错误,我觉得这可能会导致溢出问题
答案 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]=
。