PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : extern "C" malloc



dml
02-05-2012, 13:08
Hi,

ich arbeite gerade an einen Programm mit Qt(C++) und unixodbc(C), doch bekomme ich dabei leider Probleme beim Anlegen eines dynamischen Objektes, weshalb ich Euch um Eure Hilfe bitten möchte.


#include <stdlib.h>
#include <stdio.h>

extern "C" {

int main(){
int nrows = 7;
int ncolumns = 3;
int **array;
array = malloc(nrows * sizeof(int *));
if(array == NULL){
fprintf(stderr, "out of memory\n");
return 0;
}
for(int i = 0; i < nrows; i++){
array[i] = malloc(ncolumns * sizeof(int));
if(array[i] == NULL){
fprintf(stderr, "out of memory\n");
return 0;
}
}

for(int i = 0; i < nrows; i++)
free(array[i]);
free(array);

}

}


Es wäre evtl. möglich (wenn ich es schaffe) auch den unixodbc C++ Wrapper zu verwenden. Doch zum einen möchte ich unixodbc möglichst Aufwandfrei verwenden und ist es zugegebener Maßen auch eine nette kleine Aufgabenstellung an mich, etwas C zu lernen.

Vielen Dank!

jeebee
02-05-2012, 14:08
Was genau ist jetzt deine Frage? Auf den ersten Blick scheint der Code korrekt zu sein.

dml
03-05-2012, 07:56
Ups, wenn ich es mit g++ und extern "C" verwende, erhalte ich die Fehlermeldungen:


error: invalid conversion from ‘void*’ to ‘int**’
error: invalid conversion from ‘void*’ to ‘int*’

Wenn ich aber wieder extern "C" entferne und normal mit gcc es kompiliere, kommt die Fehlermeldung selbstverständlich nicht.

anda_skoa
03-05-2012, 09:11
Dann macht gcc eine implizite Typkonvertierung, die g++ nicht macht.
Der Rückgabetyp von malloc ist void*, d.h. wenn du das auf einen int* Pointer schreiben willst, musst du nach int* casten



int *i = (int*)malloc(...);


Oder nicht als extern C sondern als C++ mit



int *i = new int[...];


Ciao,
_

dml
03-05-2012, 13:02
Stimmt, manchmal ist die Lösung so offensichtlich, das man sie einfach nicht sieht. Ich war zu verwirrt wegen des extern "C", doch dürfte die Typkonvertieren auch im gcc keine Probleme bereiten, deshalb ist es ja auch egal, das es noch zusätzlich gemacht wird.

Viel Dank Euch!