C 2D-Array als Parameter + Weiterverarbeitung

Stex

Zeta Sagittarii
ID: 54415
L
11 Mai 2006
937
185
Moin,

ich habe einmal eine kleine Frage bzgl. eines Fehlers, den ich einfach nicht finde.

Ich habe folgende kleine Testprozedur:

Code:
#define N 2

void threadedMultiply(int matrixA[N][N], int matrixB[N][N], int matrixC[N][N], int noOfThreads) {
  int testmatrix[N][N];
  testmatrix = matrixA;   
}

Wenn ich das ganze kompiliere, erhalte ich:

Code:
 error: incompatible types when assigning to type ‘int[2][2]’ from type ‘int (*)[2]’

Mir ist nicht ganz klar, warum ich einer Variable des Typs int[2][2] (resp. int[N][N]) nicht den Wert einer anderen Variable dieses Typs zuweisen darf.
Ich möchte hier gern weiter die Array-Schreibweise verwenden oder ist das nicht möglich?

Vielen Dank schonmal im Voraus!
 
Moin.

In C ist ein Array (egal, wie viele Dimensionen) nur ein Zeiger auf das erste Element. Es ist keinerlei Information drüber abgelegt, wie groß die Dimensionen sind und folglich wie groß der Speicher dahinter is.
Vermutlich - das is der Punkt, den ich dir nicht mit Sicherheit sagen kann, weil ich solche Scherzchen nie gemacht hab - kann der Compiler die Zuweisung nicht machen, da er nicht garantieren kann, dass der Speicherbereich auch ausreichend groß is.

Tipp: Verwende int** als Typ, wenn du zweidimensionale Arrays hast, dann hast du sicher keine Probleme.

Was is grad noch seh: Du versuchst ja, die Speicheradresse einer Variablen zu ändern. Das geht natürlich nicht! Und das is auch die Fehlerursache.
testmatrix hat statisch Speicherplatz bekommen (kannst ja gerne mal die Assemblierung angucken, damit du siehst, was ich mein). Stackspeicher kannst du nicht einfach ummappen.
 
Was is grad noch seh: Du versuchst ja, die Speicheradresse einer Variablen zu ändern. Das geht natürlich nicht! Und das is auch die Fehlerursache.
testmatrix hat statisch Speicherplatz bekommen (kannst ja gerne mal die Assemblierung angucken, damit du siehst, was ich mein). Stackspeicher kannst du nicht einfach ummappen.

Argh, Dummheit!

Natürlich, du hast recht :)
Ich habe einfach zu lange nichts mehr in C gemacht.

Danke!