-
extern "C" malloc
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.
Code:
#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!
-
Was genau ist jetzt deine Frage? Auf den ersten Blick scheint der Code korrekt zu sein.
-
Ups, wenn ich es mit g++ und extern "C" verwende, erhalte ich die Fehlermeldungen:
Code:
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.
-
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
Code:
int *i = (int*)malloc(...);
Oder nicht als extern C sondern als C++ mit
Code:
int *i = new int[...];
Ciao,
_
-
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!