我最近发现,C的温度将允许我做如下操作:写作超出数组的末尾用C
char* myArray[1];
myArray[0] = malloc(1024 * sizeof(char));
strcpy(myArray[0], "Hello");
myArray[1] = malloc(1024 * sizeof(char));
strcpy(myArray[1], "World");
//repeat ad absurdum
有效地让我填myArray
尽可能多的数据指针,因为我喜欢,虽然只首先明确请求一个指针的内存。
为什么允许这样做? 这是否被认为是良好的做法,或者这可能导致未预见到的后果? 根据我的理解,数组中的不同索引在内存中彼此相邻分配,并且由于在初始化数组时,从未显式请求过myArray[1]
的地址,因此它可能会被其他数据占用。
它早就说过,C让你有能力在脚下自我射击。我不知道也不在乎你是否是一名负责任的枪主。基本上,边界检查需要时间。时间不适用于其他事情。在编制停车计时器时,这并不重要。当编写游戏,模拟或太空飞船时,这样的奢侈时间是无法承受的。 – enhzflep
这就是为什么编程C时,应该利用每个编译器警告,静态分析器和动态检查器工具。 (ASAN,valgrind,splint等)不幸的是,因为'myArray'在这里看起来是一个栈变量,所以valgrind不会捕获不良的访问,因为你实际上只是在栈上捣毁下一个变量。 –
-fsanitize = address(clang和gcc)可能有助于调试由内存错误引起的错误。像valgrind这样的工具也可以提供帮助。但是像Jonathon说的那样,捕捉堆栈处理错误对于外部工具来说是不可能的。 –