1

我想编写一个小程序,通过 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;
}

我的想法是程序初始化(?)一个指向特定大小缓冲区的指针。如果用户然后输入一个大于缓冲区大小的数字,它将写入未初始化的内存,因此得到一个段。过错。这个推理是否正确?

附言。编译时,I get a assignment makes pointer from integer without a cast警告,有人可以告诉我为什么会这样吗?谢谢

4

3 回答 3

3

我见过的故意获取分段错误的最传统方法是写入NULL,例如:

*((char *) NULL) = 0;

您可以使用命令行参数作为简单的布尔值来查看是否应该这样做。

请注意,写入NULL实际上并不能保证会导致崩溃,它只是未定义的行为,因此基本上任何事情都可能发生(包括导致鼻恶魔)。

警告是因为您有一个指针数组,并尝试将整数分配给数组中的指针。

于 2013-02-07T07:00:16.220 回答
1

char * buffer[100];是一个指针数组,默认指向一些垃圾位置。

在这里*( buffer + i ) = i;,您试图尊重不属于您的区域。

我的猜测是,您想创建一个缓冲区。所以

char buffer[100];足够。

于 2013-02-07T06:55:48.627 回答
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)
于 2013-03-09T19:21:05.370 回答