Assignment Discards Qualifiers

Errors and warnings generally encountered by a coder during his hard life of coder will be added here, in this special section.

I will not make difference between errors and warnings, because I always compile with CFLAGS such as -Wall -Werror -Wextra and thus warnings are treated as errors.

These errors will be those appearing after compiling a program.

So we assume that we will just try to compile and of course it will fail.

1. Assignment discards qualifiers from pointer target type

A. The problem

I try to add a char * in another char *  with the "=" operator.

#include <stdio.h> #include <stdlib.h> #include "string.h" typedef struct { char *name; } theStruct; /** * INIT */ void stringInit(theStruct *this, char const *s) { this->name = malloc(sizeof(char *) * strlen(s) + 1); this->name = s; } /** * MAIN */ int main(void) { theStruct *myStruct; myStruct = malloc(sizeof(theStruct *)); stringInit(myStruct, "Hello"); printf("myStruct->name = %s\n", myStruct->name); return (0); }

The problem may also be that you try to manipulated a const char * instead of a simple char *.

B. The solution

I now use the strcpy() function to add the char * into another one.

#include <stdio.h> #include <stdlib.h> #include "string.h" typedef struct { char *name; } theStruct; /** * INIT */ void stringInit(theStruct *this, char const *s) { this->name = malloc(sizeof(char *) * strlen(s) + 1); strcpy(this->name, s); } /** * MAIN */ int main(void) { theStruct *myStruct; myStruct = malloc(sizeof(theStruct *)); stringInit(myStruct, "Hello"); printf("myStruct->name = %s\n", myStruct->name); return (0); }

Try also to remove the const before the char * or add it if you need it.

2. Warning: assigment makes pointer from integer without a cast

A. The problem

Sometimes you can be warned by your shell with this error:

warning: assigment makes pointer from integer without a cast.

B. The solution

It is often because you forgot to include a library in your file.

Do a man of your system function to see which libraries to include:

$ man yourSystemFunction

3. functions.c:86: error: expected ‘)’ before ‘*’ token make: *** [functions.o] Error 1

A. The problem

It is often because you forgot to include a file, such as an header.h for example.

B. The solution

Include the header file in the correct source file:

#include "myHeader.h"

Tu as des connaissances en C, mais elles sont erronés et tu as des lacunes.
Premièrement, il n'existe pas de variable constante en C. Le fait de mettre le qualificateur const à une variable n'en fait pas une constante mais l'a rend non modifiable.
De plus, la norme C introduit la notion de lvalue non modifiable. Ensuite tu confonds type et type pointé.

ici toto est une lvalue modifiable, mais les caractères vers lesquels il pourrait pointé ne le sont pas via celui ci.

ici toto est une lvalue non modifiable, mais les caractères vers lesquels il aurait pu pointé le sont via celui ci.

Pour en revenir à ton problème:

s_toto et s sont tous les 2 des lvalues modifiables, en revanche, s n'autorise pas la modification des caractères pointés par celui ci, ce que permet s_toto. Voilà pourquoi ton compilateur rale, tu lui dis, j'ai une fonction dont le prototype indique que la chaine passé en paramètre ne sera pas modifié, et dans cette même fonction, tu passes cette chaine à un pointeur (s_toto) qui ne l'a protège plus contre les modifications.
Comprends tu maintenant ton erreur?
Tu dois définir s_toto ainsi:

De plus, toute variable globale non initialisée, reçoit une valeur par défaut propre à son type (0, 0.0, NULL dépendant du type).

0 Thoughts to “Assignment Discards Qualifiers

Leave a comment

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *