2016-07-20 10 views
1

Ich habe einen C-Code, ähnlich wie folgt aus:wie Steuerelement Strukturelement Verhalten mit Struct const Zeiger als Funktionsparameter?

struct st 
{ 
    int *var; 
} 

void fun(st *const ptr) 
{ 
    // considering memory for struct is already initialized properly. 
    ptr->var = NULL; // NO_ERROR 
    ptr = NULL; // ERROR, since its a const pointer. 
} 

void main() 
{ 
    //considering memory for struct is initialized properly 
    fun(ptr); 
} 

Ich möchte nicht int *var als const in der Strukturdefinition erklären, um nicht mit dem großen Code-Basis zu verwirren. Keine Änderung in der Strukturdefinition vornehmen Gibt es einen Weg in C, um einen Fehler für die NO_ERROR Zeile ptr->var = NULL; // NO_ERROR zu bekommen?

+0

Können Sie bitte genauer über _ "Gibt es einen Weg in C, um einen Fehler zu bekommen die Zeile NO_ERROR "_? Fragst du, ob 'ptr-> var = NULL' zu undefiniertem Verhalten führen kann? – user3078414

Antwort

2

erklären Sie einfach den Parameter mit const, so dass die ptr ein Zeiger auf ein konstantes Objekt ist:

void fun(const struct st* ptr) 
0

Ihre Erklärung macht ptr konstant zu sein, aber nicht das Objekt, auf das sie verweist. Verpassen Sie auch nicht struct Stichwort

void fun(struct st *const ptr); 

Stattdessen sollten Sie

void fun(const struct st *ptr); 

Eine solche Erklärung verwenden können Zeiger ändern, aber nicht das Objekt, auf das sie verweist.

0

Denken Sie daran:

  • Mit type* const ptr, können Sie den Zeiger nicht ändern, aber Sie können die spitzen Daten ändern
  • Mit const type* ptr, können Sie den Zeiger ändern, aber Sie können nicht die spitzen Daten ändern

Also alles, was Sie brauchen, ist struct st* const ptr durch const struct st* ptr zu ersetzen.

0

Hervorragend! Vielen Dank Jungs! Ich tat dies - void Spaß (const struct st * const ptr); und ich konnte einen Fehler beim Ändern sowohl ptr und ptr-> var .. Genau was ich brauchte ..