我在运行此代码时有一个分段错误,但它编译时没有问题。怎么了?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *fld[129];
} isomsg;
void iso8583_init(isomsg *m)
{
int i;
for (i = 0; i <= 128; i++) {
m->fld[i] = NULL;
}
}
isomsg m;
int main(int argc, char *argv[]) {
iso8583_init(&m);
strcpy(m.fld[0],"Fisrt");
printf("First = %s\n",m.fld[0]);
system("PAUSE");
return 0;
}
最佳答案
问题在于:
strcpy(m.fld[0],"Fisrt");
m.fld[0]
是初始化为空的指针。如果地址指向空,则无法写入该地址。这是undefined behaviour。你可能想要:
m.fld[0] = "Fisrt";
这会将字符串文本的地址分配给指针
m.fld[0]
。或者,如果要复制字符串文本
"First"
,则可以使用strdup()
(POSIX):m.fld[0] = strdup("Fisrt");
或使用
malloc()
+strcpy()
(在标准C中):m.fld[0] = malloc( sizeof("First") ); //allocate memory of 6 bytes
strcpy(m.fld[0], "First");
(您应该检查是否由于失败而返回空值。)