我想写一个小程序,通过argv用户输入,得到分段错误。我对C很新,但我认为以下代码可以完成这项任务:
int main(int argc, char *argv[])
{
int bufferSize;
char * buffer[100];
unsigned int i;
if (argc > 1) {
bufferSize = atoi(argv[1]);
for (i = 0; i < bufferSize; ++i)
*( buffer + i ) = i;
}
return 0;
}
我的想法是程序初始化(?)指向特定大小的缓冲区的指针。如果用户然后输入一个大于缓冲区大小的数字,它将写入未初始化的内存,因此得到一个seg。故障。这种推理是否正确?
聚苯乙烯。编译时,I get a assignment makes pointer from integer without a cast
警告,有人可能会告诉我为什么会这样吗?感谢
答案 0 :(得分:3)
我发现,最常见的故意获取分段错误的方法是写入NULL
,例如类似的东西:
*((char *) NULL) = 0;
您可以使用命令行参数作为一个简单的布尔值来查看是否应该这样做。
请注意,写入NULL
实际上并不能保证导致崩溃,它只是未定义的行为所以基本上任何事情都可能发生(包括导致nasal demons)。
警告是因为你有一个指针数组,并尝试为数组中的指针赋一个整数。
答案 1 :(得分:1)
char * buffer[100];
是一个指针数组,默认指向某些垃圾位置。
这里*( buffer + i ) = i;
你试图尊重不属于你的那个区域。
我的猜测是,你想创建一个缓冲区。所以
char buffer[100];
就足够了。
答案 2 :(得分:0)
我不担心写入导致分段错误。阅读足够了。如果缓冲区在堆上,则更有可能导致段错误。对于我来说,这个应用程序相当可靠地为低于-10的负输入段提供了段落。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int main(int argc, char* argv[])
{
static const int array[10] = {0,1,2,3,4,5,6,7,8,9};
int * const heapArray = malloc(sizeof(array));
memcpy(heapArray,array,sizeof(array));
const int index = atoi(argv[1]);
printf("%i\n",heapArray[index]);
free(heapArray);
return 0;
}
问题是,malloc()的结果可能比大多数系统的请求大小大得多。因此,即使对于较大的值,它也不会发生段错误,它只会返回内存中发生的任何事情。
ericu@eric-phenom-linux:~$ ./segfault -5
Segmentation fault (core dumped)
ericu@eric-phenom-linux:~$ ./segfault 11
0
ericu@eric-phenom-linux:~$ ./segfault 100
0
ericu@eric-phenom-linux:~$ ./segfault 100
0
ericu@eric-phenom-linux:~$ ./segfault 1000
0
ericu@eric-phenom-linux:~$ ./segfault 10000
0
ericu@eric-phenom-linux:~$ ./segfault 100000
Segmentation fault (core dumped)