c - 使用 malloc、结构和可能参数的问题

标签 c struct utf-8 segmentation-fault malloc

编辑:好吧,我听到你们了,我已经隔离了我的代码中给我带来问题的部分,编译它并确保它仍然给我相同的结果,这里是: 和以前一样,段错误出现在 for 循环的第一个实例之后 strcpy(replace[j]->utf8, strtok(data, "\t"));再次感谢!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

#define max_chars 45
#define max_UTF 5
#define max_ASCII 7
#define max_word_length 30
#define max_line_length 70
#define max_texto_line 5000

typedef struct {
char utf8[max_UTF];
char ascii_seq[max_ASCII];
int count;
} Replac; 


void getTable(FILE *f, char inputfile[],Replac **replace){
    char data[max_line_length];
    int j;
    f = fopen( inputfile, "r" );
    if (f == NULL) {
        fprintf(stderr, "Can't open input file %s!\n",inputfile);
        exit(1);
    }
    
    fgets(data,sizeof data,f);
    for(j=0 ; strcmp(data,"\n") ; fgets(data,sizeof data,f), j++){  
        if (feof(f)) {                                      
            break;
        }
        strcpy(replace[j]->utf8, strtok(data, "\t"));                   
        strcpy(replace[j]->ascii_seq, strtok(NULL, "\n"));
    }
    fclose(f);
}

int main( int argc, char *argv[] ){
    Replac *replace=malloc(max_chars * sizeof(Replac));
    FILE *fpr,*f,*fpw;
    int carprocess = 0;
    setlocale(LC_ALL,"pt_PT.UTF-8");
    setlocale(LC_COLLATE,"pt_PT.UTF-8");
    
    
    getTable(f,argv[1],&replace);
}

我从中复制字符的文本文件格式如下

UTFCHAR \tab asciichar

Á   'A

结束编辑

-#-##-###-####-####+#####+####p

所以我是一个使用 C 的初学者,我已经尝试了所有我能想到的,这似乎是一件非常简单的事情,但是因为我遇到了这样的麻烦,清楚地表明我在我的知识...

我不会用完整的代码来打扰你,因为它工作得很好,只是我想以不同的方式做事,这就是麻烦开始的时候。

简而言之,我正在做一个程序,收集一组 UTF8 类型的字符及其 ascii 替换,并将它们存储在结构中,例如

 typedef struct {
char utf8[max_UTF];
char ascii_seq[mac_ASCII];
} Replac; 

然后在 main 中我像这样做了 malloc

Replac *replace=malloc(max_chars * sizeof(Replac));

如果我的思考过程是正确的,这将创建一个可用内存块,*replace 指向起始地址。

然后我创建了一个函数来扫描一些 UTF8 字符及其替换并将它们存储在结构中,比如

void getTable(FILE *f, char inputfile[],Replac **replace)

现在,在调试器之后,我似乎正在创建类型为 Replace** 的新变量替换,它位于一个完全不同的地址上,但在该地址内部存储了我通过参数。

之后我做了一个

strcpy(replace[0]->utf8, something I got from the table);

跟随调试器并搜索内存地址,我看到我第一次这样做时,malloc 结构的第一个位置确实填充了正确的数据。

其次是

strcpy(replace[0]->ascii_seq, corresponding ascii sequence to the previous UTF8 char);

然后填充内存块中的下一个内存位置。

所以我在调试我的变量 watch 时得到了类似的东西

地址 replace = (Replac **) 0xbf8104fc 包含 0x0878a008

address *replace = (Replac *) 0x0878a008 包含整个结构 所以在地址 0x0878a008 中我得到了 utf8 字符的数据,然后在地址 0x0878a00d 中我得到了 ascii 序列。

问题在循环的下一个实例中,何时该

strcpy(replace[1]->utf8, something I got from the table);

我在该指令后遇到了段错误。

那么大家怎么看呢?我处理事情的方式是否正确,我是否被语法或类似的东西搞砸了,还是我的知识基础有缺陷?

谢谢,祝您节日快乐!

最佳答案

f = fopen( inputfile, "r" );
...
typedef struct 
{
    char utf8[max_UTF];
    char ascii_seq[max_ASCII];
    int count;
} Replac;
...
fgets(data,sizeof data,f);

您正在混合二进制和文本格式。

根据编译器,sizeof(Replac) 将为 16。这包括始终为 4sizeof(int)。如果大小不是 4 的倍数,也可能有填充。

如果您的数据存储为文本,那么它将是这样的:

ABCDE\tABCDEFG123456\n

请注意,十进制格式的整数大小介于 0 到 10 之间,因此大小不固定。并且有(或应该有)新行 \n 字符。

所以你不想正好读出 16 个字符。您想要为每条记录写入然后读取 3 行。示例:

ABCDE\n
ABCDEFG\n
123456\n

如果您正在以二进制方式读取,则以二进制方式打开文件并使用fwritefread。示例:

f = fopen( inputfile, "rb" );
Replac data;
fread(f, sizeof(data), 1, f);

这完全取决于您的文件是如何创建的。如果您自己编写文件,请显示您用于编写数据的代码。

此外,ASCII 是 Unicode 的一个子集。 ASCII 中的 A 与 UTF8 中的 A 具有完全相同的表示。

关于c - 使用 malloc、结构和可能参数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41353355/

相关文章:

c - 在我的 c 代码中删除重复项时出现错误

php - MySql/php utf8 似乎不能正常工作

c++ - -> 和 . 之间差异的基本原理是什么?在 C/C++ 中?

c++ - 为什么要将结构包装在匿名 union 中? (STL msvc 实现)

c - 屏蔽位运算符

c - 在 C 结构体中分配 char

子域中的utf-8?

python - Werkzeug 引发 BrokenFilesystemWarning

c++ - 二叉搜索树插入如何使用递归工作?

c - 需要一种方法来解析 C 中的代数表达式