我在运行此代码时有一个分段错误,但它编译时没有问题。怎么了?

#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");

(您应该检查是否由于失败而返回空值。)

09-07 22:22