これは とは関係ありませprintw()
ん。メモリを正しく割り当てていないだけです。ここ:
char** matrice = malloc(sizeof(char*)*51);
実際の文字列にメモリを割り当てません。51 個のポインタにメモリを割り当てますが、それらが指すメモリを割り当てません。getline()
したがって、呼び出しは未割り当てのメモリに読み込もうとしており、未定義の動作が発生します。プログラムが適切に動作するようになるまで、すべての賭けはオフです。
これらの 51 個のポインターのそれぞれにいくらかのメモリを割り当てるか、単に静的配列を使用する必要があります。
書かれているように、最後にfree()
メモリに失敗し、実際にメモリを提供したかどうかを確認するためにmalloc()
からの戻り値をチェックしません。malloc()
このようなものがあなたが望むものです:
#include <stdio.h>
#include <stdlib.h>
#define ARRSIZE 51
#define STRSIZE 100
int main(void) {
int i;
char ** matrice = malloc(ARRSIZE * sizeof(*matrice));
if ( matrice == NULL ) {
fputs("Couldn't allocate memory!", stderr);
return EXIT_FAILURE;
}
for ( i = 0; i < ARRSIZE; ++i ) {
matrice[i] = malloc(STRSIZE);
if ( matrice[i] == NULL ) {
fputs("Couldn't allocate memory!", stderr);
return EXIT_FAILURE;
}
}
/* Rest of your program */
for ( i = 0; i < ARRSIZE; ++i ) {
free(matrice[i]);
}
free(matrice);
return 0;
}
編集:本当に を使用したい場合getline()
は、元のプログラムのバージョンを次に示します。
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <ncurses.h>
int main(int argc, char const *argv[]) {
size_t nbytes = 0;
int i = 0, j = 0;
if ( argc < 2 ) {
fputs("You must specify a file name!", stderr);
return EXIT_FAILURE;
}
FILE *lab = fopen(argv[1], "r");
if ( lab == NULL ) {
fputs("Couldn't open file!", stderr);
return EXIT_FAILURE;
}
char **matrice = malloc(sizeof(char *) * 51);
if ( matrice == NULL ) {
fputs("Couldn't allocate memory!", stderr);
return EXIT_FAILURE;
}
for ( j = 0; j < 51; ++j ) {
matrice[j] = NULL;
}
while ( i < 50 &&
(getline(&matrice[i], &nbytes, lab) != -1) ) {
i++;
}
if ( i == 0 ) {
fputs("File was empty.", stderr);
free(matrice[0]);
free(matrice);
return EXIT_FAILURE;
}
printf("%s", matrice[0]);
getchar();
initscr(); /* Start curses mode */
cbreak(); /* Line buffering disabled */
keypad(stdscr, TRUE); /* We get F1, F2 etc.. */
noecho(); /* Don't echo() while we do getch */
printw(matrice[0]);
printw("dummy line\n");
refresh();
getch();
endwin();
for ( j = 0; j <= i; ++j ) {
free(matrice[j]);
}
free(matrice);
return EXIT_SUCCESS;
}
ただし、独自のメモリを割り当てて使用するfgets()
方が優れています.ncursesのようなサードパーティのライブラリを最初から使用している場合でも、完全に標準的な方法がある場合は、非標準の拡張機能を使用する必要はありません.