Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针结构的问题_C_Pointers - Fatal编程技术网

C 指针结构的问题

C 指针结构的问题,c,pointers,C,Pointers,我有一个分段错误时,这段代码运行,但它编译没有问题。怎么了 #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->f

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

#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;
}
#包括
#包括
#包括
类型定义结构{
char*fld[129];
}isomsg;
无效iso8583_初始值(isomsg*m)
{
int i;
对于(i=0;i fld[i]=NULL;
}
}
isom;
int main(int argc,char*argv[]){
iso8583_init(&m);
strcpy(m.fld[0],“first”);
printf(“First=%s\n”,m.fld[0]);
系统(“暂停”);
返回0;
}

有问题的一行是:

strcpy(m.fld[0],"Fisrt");
m.fld[0]
是一个初始化为NULL的指针。如果地址指向NULL,则无法写入地址。这是错误的

您可能想要:

m.fld[0] = "Fisrt";
这将字符串文本的地址分配给指针
m.fld[0]

或者,如果您想复制字符串literal
“First”
,则可以使用
strdup()
(POSIX):

或者使用
malloc()
+
strcpy()
(标准C):

(您应该检查/
malloc()
是否由于失败而返回NULL。)

如果我使用:memcpy(&m.fld[0],“First”,5);@user5240895 memcpy()是另一种复制方式。但是在任何情况下,您都需要让指针指向有效的内存位置,也就是说,您仍然需要对传递给memcpy()的指针执行malloc()。
m.fld[0] = strdup("Fisrt");
m.fld[0] = malloc( sizeof("First") ); //allocate memory of 6 bytes
strcpy(m.fld[0], "First");