分段错误:11(由strncpy()引起)

时间:2017-09-11 21:27:30

标签: c segmentation-fault

这是我的代码。我一直在努力解决为什么strncpy()无法将字符串复制到struct,因为它在我之前的作业中完美无缺。另外,我有第二个问题:假设我有一个包含另一个结构的结构,如何将值赋给内部结构:

struct _field {
    char fieldName[50];
    char fieldType[50];
    int fieldLength;
};
struct _table {
    char *tableFileName;
    int reclen;
    int fieldcount;
    struct _field fields[100]; 
};

typedef enum { false, true } bool;

bool loadSchema(struct _table *table) {

    printf("%s\n", "*** LOG: Loading table fields...");

    FILE *fp = NULL;
    char lines[1000];
    char s[2] = " ";

    fp = fopen("in.txt", "r+");

    while (fgets(lines, sizeof(lines), fp) != NULL) {
        char *token;
        token = strtok(lines, s);

        if (token != NULL) {
            if (strcmp(token, "CREATETABLE") == 0) {
                token = strtok(NULL, s);
                if (token != NULL) {
                    token[strlen(token)-1] = '\0';
                    strcat(token, ".bin");
                    //table->tableFileName = token; // this line can write the value into struct
                    strncpy(table->tableFileName, token, 20);// this line cant write the value into struct
                }
                printf("*** LOG: Table name is [%s]\n", table->tableFileName);
            }
            /*if (strcmp(token, "ADD") == 0) {
                token = strtok(NULL, s);
                if (token != NULL) {    
                   strncpy((*table).fields. fieldName, token, 50);      
                }// Q2: how to give a value into a struct of a struct?
            }*/
        }
    }
    return 1;
}

输入文件如下所示:

CREATETABLE people
ADD id char 50
ADD lname char 50

2 个答案:

答案 0 :(得分:0)

问题1:您正在尝试复制到没有分配空间的字符串中。 table-> tableFilename只是一个指针。您需要动态分配空间或声明数组的固定宽度。

赋值表 - > tableFilename = token可以正常工作,因为它只是将指针指定为vaule,它不会尝试将数据复制到未分配的空间。

问题2:在声明表中 - > _fields是一个数组,因此您需要索引特定实例以为其成员分配值。例如。表 - >字段[0] .fieldName

答案 1 :(得分:0)

您正在获取分段错误,因为在您尝试访问指针表的代码中,它们没有分配内存,因此它指向null。因此崩溃。 该问题的解决方案是复制这些行

table = (struct _table*)(malloc (sizeof(struct _table)));

table->tableFileName = (char *)(malloc (sizeof(char) * 20));
strncpy(table->tableFileName, token, 20);

并记得释放他们。 回答你的第二个问题你只需要直接分配值 outer_struct.innerstruct.field1 = value outer_struct.innerstruct.field2 = value

或者如果内部结构是指针,则需要先为其初始化内存,然后您可以指定或直接使用memcpy。