2016-10-22 67 views
-2

我最近发现,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]的地址,因此它可能会被其他数据占用。

+2

它早就说过,C让你有能力在脚下自我射击。我不知道也不在乎你是否是一名负责任的枪主。基本上,边界检查需要时间。时间不适用于其他事情。在编制停车计时器时,这并不重要。当编写游戏,模拟或太空飞船时,这样的奢侈时间是无法承受的。 – enhzflep

+2

这就是为什么编程C时,应该利用每个编译器警告,静态分析器和动态检查器工具。 (ASAN,valgrind,splint等)不幸的是,因为'myArray'在这里看起来是一个栈变量,所以valgrind不会捕获不良的访问,因为你实际上只是在栈上捣毁下一个变量。 –

+1

-fsanitize = address(clang和gcc)可能有助于调试由内存错误引起的错误。像valgrind这样的工具也可以提供帮助。但是像Jonathon说的那样,捕捉堆栈处理错误对于外部工具来说是不可能的。 –

回答

3

C是一种非常不安全的语言。你通常可以做任何你想做的事情,并且通过做你所做的事情来毁掉记忆。通常在简单的程序中你不会注意到这些效果,但它很快就会变得明显。

总之 - 这是允许的但危险的,不应该这样做。

在c编程时,你必须检查每一行。

1

C没有对数组访问进行边界检查,并且尝试读取或写入数组末尾导致未定义的行为。缓冲区溢出是常见的恶意软件漏洞。

+0

+1提到缓冲区溢出。但我想你应该详细说明一点,让OP知道他们有多讨厌。 –