displayX
@displayX (あーる)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ポインタ配列の要素に文字列を入れるとエラー

解決したいこと

ポインタ配列に文字列を入れるとメモリ関連のエラーが出ます。

していること: 
 文字列を記号で分割して、ポインタ配列の各要素に入れていく。

発生している問題・エラー

  // 文字列とセパレーター
  char str[] = "aa,bbb,cccc";
  char sep = ',';

  // 文字列保存用
  char tmp[100]; // ポインタ配列の1行分
  char* tmp2[4]; // ★ポインタ配列

  // 文字列を末尾までループで回して・・・
  for (int i = 0, j = 0; str[i] != '\0'; ++i) {
    // 文字が sep であれば、そこまでの文字列をポインタ配列に入れる
    if (str[i] == sep) { 
      tmp2[j] = tmp; // ★ここでメモリ関連の警告が出る
      j++; 
      continue; 
    }
    tmp[i] = str[i];
   }

crtisvalidheappointer(block) エラー
または「動作を停止しました」

なぜ問題があるのか、さっぱり分かりません。

※tmpではなく、直接tmp2[j][i]にも入れましたが同じ問題が発生します。
※char** tmp2 でも同じようなエラーが出ます。

0

3Answer

エラーの原因はともかく、おそらくこれ期待している動作にはなりませんよ。
tmp2[j] = tmpではtmp配列の先頭アドレスが代入されるだけです。

0Like

コードが要件を満たすかどうかはともかく、実行しても、以下のコンパイル時の警告のみで、仰るような実行時エラーは生じませんでした。
(Wandbox, ​gcc 12.0.0)

warning: variable 'tmp2' set but not used [-Wunused-but-set-variable]
|   char* tmp2[4]; // ★ポインタ配列
|         ^~~~

質問に書かれているエラーは、コンパイル時のものでしょうか? あるいは、実行時のものでしょうか?
コンパイル時のものでしたら、コードの問題ではなく、ビルド環境に問題が生じているように思われます。
お使いの環境について言及していただくと、解決の糸口になるかも知れません。

0Like

文字列を記号で分割して、ポインタ配列の各要素に入れていく。

書かれていたコードを元に、それっぽく動く感じにしてみました。

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

int main(void) {
	char str[] = "aa,bb,cc"; // 分割前文字列
	char sep = ','; // セパレーター

	char *tmp; // 分割後文字列ポインタ
	char *tmp2[4]; // 分割後文字列ポインタ配列
	int tmp2_idx = 0; // 分割後文字列ポインタ配列のインデックス

	tmp = (char *)calloc(100, sizeof(char)); // メモリー確保

	// 文字列を末尾までループで回して・・・
	for (int i = 0, j = 0; str[i] != '\0'; ++i) {
		// 文字が sep であれば、
		// 分割後文字列ポインタ を 分割後文字列ポインタ配列 に入れる
		if (str[i] == sep) {
			tmp2[tmp2_idx++] = tmp;

			tmp = (char *)calloc(100, sizeof(char));  // メモリー確保
			j = 0;
			continue;
		}

		tmp[j++] = str[i];
	}

	tmp2[tmp2_idx] = tmp;

	// 分割後文字列ポインタ配列 を出力
	for (int i = 0; i <= tmp2_idx; i++) {
		printf("tmp2[%d] = %s\n", i, tmp2[i]);

		free(tmp2[i]); // メモリー開放
	}
}

何かの参考になれば、幸いです。

0Like

Your answer might help someone💌