I’m having some trouble with lists in C.
I made this struct:
typedef struct str {
char * str;
struct str * prox;
struct str * ant;
} cadena;
Then in the main I start the list with its first pointer to NULL.
cadena * lista = NULL;
Then I made a function where the user can add new elements to the lists (strings in the “str” member) and I manage the pointers to build the list. That seems to work OK. I hope.
But when I want to print a member of one node, it I’m trying to use something like this, and its not working:
void showdata (cadena *lista) {
int i=0;
while (lista.str[i] != '\0')
{
printf("%c\n",str[i]);
i++;
}
}
I’m getting these errors:
from line "while (lista.str[i] != '\0')"
.error: request for member ‘str’ in something not a structure or union
(why is it expecting a structure? I thought I’m accessing a member there)
from line "printf("%c\n",str[i]);"
.error: ‘str’ undeclared (first use in this function)
(isn’t it declared with the struct?)
I’m surely doing something really wrong, but I cannot understand which is the right way to access a char member and print it.
Thank you in advance.
It’s a pointer notation problem. C can be confusing in this way.
lista.str[i]doesn’t work because C doesn’t recognize the “.” as moving to a field. This can be a problem for people like myself who were used to C# or other OOP languages, where you can use the “.” to modify properties of an object, like
control.visibility = "False"In C, structs are based on pointers, so you need to use the -> like Keith said. You’re pointing to a location in memory, or the “location” in the struct where a certain field is. Think of it that way, and you shouldn’t have too many problems.
C also allows you to use the “.”… but only if you strongly type the reference. For you, that would mean going
(*lista).str[i]so that your reference to the lista instance is seen as a pointer to the struct.
So, in review, either
lista->str[i]or
(*lista).str[i]should work.