webentwicklung-frage-antwort-db.com.de

lWert als Inkrementierungsoperand erforderlich

gcc 4.4.4

Was mache ich falsch?

char x[10];
char y[] = "Hello";
while(y != NULL)
    *x++ = *y++;

Vielen Dank für jeden Hinweis.

23
ant2009

x++ ist die Kurzform von x = x + 1. x ist jedoch ein Array, und Sie können die Adresse eines Arrays nicht ändern. So ist es auch mit Ihrer Variablen y.

Anstatt zu versuchen, Arrays zu inkrementieren, können Sie eine ganze Zahl i deklarieren, diese erhöhen und dann auf den i-ten Index eines Arrays zugreifen.

char x[10], y[5] = "Hello";
int i = 0;
while (y[i] != 0)
{
    x[i] = *y[i];
    i++;
}
x[i] = 0;
28
naivnomore

Wahrscheinlich sind Sie einem weit verbreiteten Missverständnis zum Opfer gefallen, dass "Array ein Zeiger" ist, d. H. Wenn Sie ein Array definieren, erhalten Sie einen gewöhnlichen Zeiger, der auf einen Speicherblock verweist, der irgendwo zugewiesen wurde. In Ihrem Code versuchen Sie, diesen Zeiger zu erhöhen.

Der Code "funktioniert" nicht, da Arrays in Wirklichkeit keine Zeiger sind. Arrays sind Arrays. Arrays können nicht inkrementiert werden. Es gibt keine Operation wie "Inkrementieren eines Arrays" in C-Sprache. Tatsächlich sind Arrays in C nicht modifizierbare l-Werte. In C gibt es keine Operationen, die das Array selbst modifizieren können (nur einzelne Elemente können geändert werden).

Wenn Sie Ihre Arrays mit der Technik des "gleitenden Zeigers" durchqueren möchten (was Sie tatsächlich versuchen), müssen Sie die Zeiger explizit erstellen und auf die Startelemente Ihrer Arrays zeigen

char *px = x;
char *py = y;

Danach können Sie diese Zeiger beliebig erhöhen.

20
AnT

Arrays in C sind zwar Zeiger, aber konstante Zeiger, dh ihre Werte können nach der Deklaration nicht geändert werden.

int arr[] = {1, 2, 3};
// arr is declared as const pointer.

(arr + 1) ist möglich, aber arr++ ist nicht möglich, da arr keine andere Adresse speichern kann, da sie konstant ist.

7
Sushil Kadu
char x[10];
char y[] = "Hello";
char *p_x = &x[0];
char *p_y = &y[0];
while(*p_y != '\0') *p_x++ = *p_y++;

Da Sie die Array-Adressen nicht ändern können (dies geschieht durch x++ und y++ in Ihrem Code) und Sie die Zeigeradresse can ändern können, habe ich die Adresse des Arrays in separate Zeiger kopiert und dann erhöht . 

Wenn Sie möchten, können Sie die Notation sicherlich reduzieren, aber ich hoffe, Sie haben den Punkt verstanden.

5
Jacob

x und y sind Arrays, keine Zeiger.

In den meisten Ausdruckskontexten zerfallen sie in Zeiger, beispielsweise in einem inkrementellen Ausdruck, aber in r-Werte, nicht in l-Werte, und Sie können Inkrementoperatoren nur auf l-Werte anwenden.

3
CB Bailey

Da Sie x und y als Arrays definiert haben, können Sie diese nicht ändern. Eine Möglichkeit wäre, stattdessen Zeiger zu verwenden:

char x[10];
char *xx = x;

char *y = "Hello";

while (*y != '\0')
    *xx++ = *y++;

Beachten Sie, dass ich auch Ihre Beendigungsbedingung behoben habe - ein Zeiger wird nicht zu NULL, nur weil er das Ende einer Zeichenfolge erreicht hat.

1
Jerry Coffin

Meistens Array wie ein Zeiger. 

Denken Sie daran, dass Sie das Array nicht ändern können! 

Und y++ ist y = y + 1

char y[] = "Hello";

Sie ändern also das Array, wenn Sie y++ !!

Es wird error: lvalue required as increment operand erzeugt.

0
user2959760

Wir können einen Array-Namen nicht ändern, aber was ist mit argv++ in f(int argv[])?

Zitate von K & R in p99 “Ein Array-Name ist nicht variabel; Konstruktion wie a = pa und a++ sind unzulässig ", was besagt, dass der Name eines Arrays ein Synonym für die Position des ursprünglichen Elements ist."

Warum aber im Funktionsparameter func(char *argv[]), argv++ möglich ist, obwohl argv ein Arrayname ist.

In int *a[10] können wir a++ nicht wie argv++ ausführen.

Der Name des Arrays ist ein Synonym für die Position des Ausgangselements. --- K & R 

arrayname++ ist illegal.

In Funktionsparametern wie char *argv[] ist dies identisch mit char **argv. type *arrayname_para[] in parameter ist ein weiteres Synonym für type **arrayname_para

0
EvanL00