#c #pointers #structure
#c #указатели #структура
Вопрос:
Я должен написать модуль для реализации string, и у меня есть приблизительное представление о том, как и с чего начать. Но я продолжаю получать сообщение об ошибке каждый раз, когда пытаюсь использовать оператор стрелки в C.
SET — предполагается выделить память и инициализировать строку с помощью ввода. COPY — копировать копирует одну строку в другую CONCAT — конкатенация PRINT — выводит ее в конце
Поэтому любая помощь будет оценена:
Файл заголовка:
#ifndef string_h
#define string_h
typedef struct {
int len;
char *s;
} string_t;
typedef string_t *string;
void set(string *s1, char *s);
void copy(string *s1, string s2);
void concat(string *s1, string s2);
void print(string s1);
#endif /* string_h */
Файл реализации:
#include "string.h"
#include <string.h>
#include <stdlib.h>
void set(string *s1, char *s) {
s1 = (string*) malloc (sizeof(string));
if(s == NULL) {
s1 -> len = 0;
} else {
s1 -> len = strlen(s);
s1 = (string*) malloc (sizeof(s1 -> len));
s1 -> s = s;
}
}
void copy (string *s1, string s2) {
}
void concat(string *s1, string s2) {
}
void print(string s1) {
}
Заголовочные файлы кажутся совершенно нормальными, так как они мало что делают. Но компилятор каждый раз выдает ошибку для «s1 -> len». Так что, если кто-нибудь может мне здесь помочь, я был бы признателен, спасибо.
Комментарии:
1. Поскольку
set()
s1
аргумент ‘s фактически является указателем на указатель наstring_t
(это то, что вам нужно, так что это хорошо), вам нужно разыменовать его в вашейmalloc()
строке. Вам нужно установить, на что он указывает , на адрес выделяемой вами памяти, и выделить место для astring_t
, а не дляstring
:*s1 = malloc(sizeof(string_t));
2. Я только что сделал, но это все еще не решило эту ошибку «s1 -> len»
3. Разыменование там тоже:
(*s1)->len
4. Или используйте local
string tmp
вместоs1
внутри функции, затем установите*s1 = tmp
перед возвратом.5. Большое спасибо!! Это сработало! и еще один вопрос. Должен ли я также разыменовывать его в операторе if? Я имею в виду, что это было бы что-то вроде этого: (* s1) = malloc (sizeof((* s1) -> len));
Ответ №1:
s1
похоже, это указатель на указатель, а не указатель на тип структуры.
Вы можете просто изменить typedef
, чтобы удалить тип указателя, или просто использовать string
type (not string *
), поскольку в противном случае он сам уже является указателем.
Комментарии:
1. Да, это то, что я подумал, но я понятия не имею, как исправить / использовать это в моей реализации без изменения файла заголовка..
2. @dean_winchester только что дал подсказку в ответе.
3. Спасибо, я только что это увидел! Но я не знаю, разрешено ли мне даже изменять параметры и файл заголовка, потому что это то, что дал нам профессор. Поэтому мне было интересно, есть ли какой-либо другой способ решить эту проблему без изменения файла заголовка.
4. @dean_winchester: просто используйте
string
в реализации, А НЕstring*
. Нет необходимости вообще изменять файл заголовка.5. @MarkBenningfield Да, но поскольку процедура объявлена в файле заголовка, мне также придется изменить ее параметры там.