EDIT: Хорошо, я слышал, вы, ребята, я выделил часть моего кода, которая вызывает у меня проблемы, скомпилировала ее и удостоверилась, что она все же дала мне те же результаты, вот она идет: Как и прежде, segfault появляется после первого экземпляра цикла for на strcpy (replace [j] -> utf8, strtok (data, "\ t")); Еще раз спасибо!Проблемы с использованием malloc, structs и, возможно, параметров
#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
END EDIT
- # - ## - ### - #### - #### + ##### + #### p
Поэтому я начинаю использовать C, и я пробовал все, что мог придумать, это похоже на довольно прямолинейную вещь, но, поскольку у меня такие проблемы, я вижу, что у меня есть некоторый пробел в моих знаниях. .
Я не буду беспокоить вас полным кодом, так как он работает отлично, просто я хотел сделать что-то по-другому, и вот когда началась проблема.
Короче я делаю программу, которая собирает набор символов типа UTF8, а также их замену ASCii, и сохраняет их в структуры, такие как
typedef struct {
char utf8[max_UTF];
char ascii_seq[mac_ASCII];
} Replac;
затем в основном я сделал таНос как это
Replac *replace=malloc(max_chars * sizeof(Replac));
Если мой мыслительный процесс является правильным, это может создать блок доступной памяти, в которой * заменить указывает на начальный адрес.
Тогда я сделал функцию, которая сканирует несколько UTF8 символов и их замену и хранит их в структурах, что-то вроде
void getTable(FILE *f, char inputfile[],Replac **replace)
теперь, после отладчика, кажется, что я создаю новые переменные заменить типа Replace **, который находится на совершенно другом адресе, но внутри этого адреса сохраняется значение в исходной структуре malloced, которую я прошел через параметр.
После этого я делаю
strcpy(replace[0]->utf8, something I got from the table);
после отладки и поиска по адресам памяти, я вижу, что первый раз, когда я это сделать, первое положение таНос структуры действительно заполнены правом данных ,
с последующим
strcpy(replace[0]->ascii_seq, corresponding ascii sequence to the previous UTF8 char);
и заполняет следующую позицию памяти в блоке памяти.
Так я получаю что-то вроде во время отладки на моем переменных смотреть
адрес заменить = (зам **) 0xbf8104fc, который содержит 0x0878a008
адреса * заменить = (заме *) 0x0878a008, который содержит всю -структуру поэтому внутри адреса 0x0878a008 я получаю данные utf8 char, а затем по адресу 0x0878a00d. Я получаю ascii seq.
Проблема в на следующем экземпляре цикла, когда пришло время
strcpy(replace[1]->utf8, something I got from the table);
Я получаю ошибку сегментации после этой инструкции.
Так что вы, ребята, думаете? Правильно ли я приближаюсь к вещам, и я навязываюсь синтаксисом или чем-то подобным, или это база моих знаний ошибочна?
Спасибо, и поздно счастливые праздники!
Без подлинного кода это описание кода сложнее, а ИМО недостаточно для определения ошибки сегментации. Было бы лучше, если бы все увидели истинный код. – chux
Добро пожаловать в SO. Ознакомьтесь с этим https://stackoverflow.com/help/mcve, чтобы создать минимальный пример кода, создающего ошибку. –
Вы не можете использовать 'Replac ** replace' так, чтобы вы только выделили один« Replac ». http://stackoverflow.com/questions/12462615/how-do-i-correctly-set-up-access-and-free-a-multidimensional-array-in-c – Stargateur