代码无法初始化字符串数组

时间:2016-08-10 15:21:25

标签: c arrays string pointers

我正在尝试做一些非常简单的事情:建立一个包含10个八字符字符串的集合,并为每个字符串分配一个简单的默认值。我的代码分配了第一个字符串值,但随后又出现了分段错误。代码如下。谁能看到我做错了什么?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main() {

   char *(names)[8];
   int i;
   char defstr[] = "none";

   *names = malloc(sizeof(char)*8*10);

   printf("%s\n",defstr);

   printf("defining\n");

   for (i=0; i<10; i++) {
      strcpy(names[i], defstr);
      printf("done with %d, string is %s\n", i, names[i]);
   }

   printf("now printing\n");

   for (i=0; i<10; i++) {
      printf("%s\n", names[i]);
   }
}

输出

$> ./a.out
none
defining
Segmentation fault: 11

3 个答案:

答案 0 :(得分:4)

DT1 = date +%F
DT2 = 9 days ago

0 12 * * tue  _DV=`$DT1 --date="$DT2"`; ~/scripts/test.sh $_DV

声明一个包含8个指针的数组,与

相同
char *(names)[8];

然后

char* names[8];

将第一个指针设置为指向80个字符的数组。其他7个指针仍然没有初始化。

你似乎想要一个指向数组的指针,它将是

*names = malloc(sizeof(char)*8*10);

答案 1 :(得分:1)

对于初学者来说这个宣言

char *(names)[8];

相当于

char * names[8];

并声明一个包含8个指针的数组。

在本声明中

*names = malloc(sizeof(char)*8*10);

数组的第一个元素(即元素名[0])由分配的内存的地址初始化。所有其他元素都有不确定的值。

因此以下循环

for(i = 0; i&lt; 10; i ++){       strcpy(names [i],defstr);       printf(“用%d完成,字符串是%s \ n”,i,names [i]);    }

不正确并导致程序的未定义行为,因为据说没有初始化索引大于0的数组元素。

您的意思是以下

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define M   10
#define N   8

int main( void ) 
{
    char ( *names )[N];
    int i;
    char defstr[] = "none";

    names = malloc( sizeof( char[M][N] ) );

    printf( "%s\n", defstr );

    printf( "defining\n" );

    for ( i = 0; i < M; i++ ) 
    {
        strcpy(  names[i], defstr );
        printf( "done with %d, string is %s\n", i, names[i] );
    }

    printf("now printing\n");

    for ( i = 0;  i < M; i++ ) printf( "%s\n", names[i] );

    free( names );

    return 0;
}

在这个程序中,动态分配了char [M][N]类型的二维数组。而这个宣言

char ( *names )[N];

声明指向类型为char[N]的数组的指针。

或以下

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define M   10
#define N   8

int main( void ) 
{
    char * names[M];
    int i;
    char defstr[] = "none";

    printf( "%s\n", defstr );

    printf( "defining\n" );

    for ( i = 0; i < M; i++ ) 
    {
        names[i] = malloc( sizeof( char[N] ) );
        strcpy(  names[i], defstr );
        printf( "done with %d, string is %s\n", i, names[i] );
    }

    printf("now printing\n");

    for ( i = 0;  i < M; i++ ) printf( "%s\n", names[i] );

    for ( i = 0; i < M; i++ ) free( names[i] );

    return 0;
}

在这个程序中,声明了一个类型为char * [M]的一维数组,并且数组的每个元素都由类型为char[N]

的已分配内存的地址初始化

答案 2 :(得分:0)

您正在获取seg错误,因为您正在覆盖已分配的内存。

*names = malloc(sizeof(char)*8*10);

此行为8个字符串中的第一个分配8个字节的空间。

当i == 0时,在:

strcpy(names[i], defstr);

用defstr覆盖名称[0]。但是名字[0] == *名称(你已经分配了。因此你就丢失了你的分配。

您必须分配**的所有部分。