我正在尝试做一些非常简单的事情:建立一个包含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
答案 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] == *名称(你已经分配了。因此你就丢失了你的分配。
您必须分配**
的所有部分。