Я получаю ошибку сегментации при использовании strncpy и (pointer-to-struct) -> (член) нотации:Почему при использовании strncpy возникает ошибка сегментации?
Я упростил свой код. Я инициализирую структуру и устанавливаю все ее токены в пустую строку. Затем объявите указатель на структуру и присвойте ему адрес структуры.
Я передаю указатель на функцию. Я могу распечатать содержимое структуры в начале функции, но если я попытаюсь использовать tp -> мнемонику в функции strncpy, я получаю seg fault. Может ли кто-нибудь сказать мне, что я делаю неправильно?
typedef struct tok {
char* label;
char* mnem;
char* operand;
}Tokens;
Tokens* tokenise(Tokens* tp, char* line) {
// This prints "load"
printf("Print this - %s\n", tp -> mnem);
// This function gives me segmentation fault
strncpy(tp -> mnem, line, 4);
return tp;
}
int main() {
char* line = "This is a line";
Tokens tokens;
tokens.label = "";
tokens.mnem = "load";
tokens.operand = "";
Tokens* tp = &tokens;
tp = tokenise(tp, line);
return 0;
}
Я использовал команды printf, чтобы подтвердить, что код определенно прекращает выполнение функции strncpy.
Я не понимаю, почему я хотел бы изменить переменную tp. Это указатель, и он указывает на некоторую память, которая уже была выделена для структуры токенов. Если я malloc, это будет выделять некоторую новую память, которая не является структурой токенов, не так ли? И я не хочу этого. – Joe
Вы ошибаетесь в отношении права собственности на память, на которую ссылается «tp» в примере кода. Это адрес структуры, которая была объявлена в стеке. Совершенно законно использовать указатель на него, как показано, до тех пор, пока ссылочная структура не выходит за рамки. В этот момент память освобождается, и ее более безопасно ссылаться. Ошибка в коде OP находится в другом месте (см. Мой ответ). –
-1: Это не имеет абсолютно никакого отношения к его проблеме. – rampion