在malloc()之后访问数组时出现突然分段错误

时间:2016-11-14 00:22:32

标签: c arrays malloc

我有一个数组char *Input[11]。我使用malloc()为它分配内存。

    for(int i = 0; i < 12; i++) 
        Input[i] = "\0";

    for(int i = 0; i < 12; i++)
    {

        Input[i] = malloc( 256 * sizeof(char) );
    }

    for(int i = 0; i < 12; i++)
    {
        strcpy(Input[i], "test");
    }

    printf("Input[11] is %s\n", Input[11]); // <- Here the seg fault happens

之后我想要访问Input[11]时出现分段错误。我读到你在Input[11]指向什么都没有的情况下通常会在上下文中出现这个错误所以我想我分配内存的方式有问题。访问Input[10]及以下版本可以正常使用。我用valgrind检查了它,这是错误信息:

==5633== 1 errors in context 1 of 1:
==5633== Invalid read of size 1
==5633==    at 0x4098383: vfprintf (vfprintf.c:1632)
==5633==    by 0x409D695: printf (printf.c:33)
==5633==    by 0x8048A15: handle_command (swebsh.c:122)
==5633==    by 0x8048BE6: main (swebsh.c:181)
==5633==  Address 0x6e69622f is not stack'd, malloc'd or (recently) free'd

但是,除了错误的位置,我不确定这告诉我的是什么。任何帮助表示赞赏。

编辑:糟糕,在简化代码时忘记初始化!

1 个答案:

答案 0 :(得分:2)

如果一个数组有N个元素,那么索引的有效范围是[0, N-1]在你的代码片段中,你声明一个数组有11个元素。因此,数组的有效索引范围为[0, 10]

为避免此类错误,请不要使用魔术数字。而是为它们使用一些名称。

您的代码可以通过以下方式重写

#define N 11

//...

char *Input[N] = { 0 };
int length = 256;

for( int i = 0; i < N; i++ )
{
    Input[i] = malloc( length * sizeof( char ) );
}

for ( int i = 0; i < N; i++ ) strcpy( Input[i], "test" );

printf( "Input[N - 1] is %s\n", Input[N - 1] );