c
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define MAX_LEN 100 //文字配列のサイズ(入力文字列の最大長さ+1) 6 7//文字列の画面出力用関数 8void output_strings(char **array_p, int m) 9{ 10 int i; 11 printf("%d\n", m); 12 for(i=0; i<m; i++) { 13 printf("%s\n", array_p[i]); 14 } 15} 16 17 18int main( void ) 19{ 20 int i,j; 21 int n; //文字列の個数 22 char data[MAX_LEN]={}; //入力用文字列 23 char **str_p; 24 char *p; 25 26 //文字列の個数の入力 27 printf("Number of strings -> "); 28 scanf("%d", &n); 29 30 //文字列へのポインタを格納するポインタ配列の動的確保 31 str_p = (char **)malloc(sizeof(char *) * n); 32 33 //iii〜vの処理 34 for(i=0; i<n; i++) { 35 printf("Input strings -> "); 36 scanf("%s", data); 37 printf("%s\n", data); 38 str_p[i] = (char *)malloc(strlen(data) + 1); 39 strcpy(str_p[i], data); 40 41 } 42 43 44 //文字列の画面表示 45 printf("\nBefore sorting\n"); 46 output_strings(str_p, n); 47 48 //文字列を長さが短い順番に並べ替え 49 char *tmp; 50 for(i=0; i<n-1; i++) { 51 for(j=i+1; j<n; j++) { 52 if(strlen(str_p[i])>strlen(str_p[j])) { 53 tmp = str_p[i]; 54 str_p[i] = str_p[j]; 55 str_p[j] = tmp; 56 } 57 } 58 } 59 60 //並べ変えた文字列の画面表示 61 printf("\nAfter sorting\n"); 62 output_strings(str_p, n); 63 64 //動的確保した領域の開放 65 free(str_p); 66 for(i=0; i<n-1; i++) { 67 free(str_p[i]); 68 } 69 70 return 0; 71}
上記のコードで何かおかしいところはありますか?
一応画面表示したいことは全てできて警告なども出ないのですが、一番最後の動的確保した領域の開放で、for文のループ条件がi<n-1になる理由がわかりません。
mallocで動的確保したのはstr_p[n-1]までだと思うのでここでのfor文のループ条件はi<nではないでしょうか?しかしi<nと書くと動的確保してない領域まで開放している開放しているという内容のメッセージが出てきてしまいます。そこで、このコード自体どこかおかしいのではないかと疑ったのですが、i<n-1となる理由を教えてください。
質問の前提が分かりづらいようです。このコードは質問者さんが書いたものではないのですか? 自分で書いた上で、「おかしいところはないか?」というレビューなのでしょうか。それとも、他人が書いたコードで理解できないところがあり、その部分が「for文のループ条件がi<n-1になる理由がわかりません。」と言うことなのでしょうか。
回答2件
あなたの回答
tips
プレビュー