簡體   English   中英

動態分配2D數組時C分段錯誤

[英]C segmentation fault when dynamically allocating 2d array

我正在嘗試編寫一個ac程序,它將從Linux管道中獲取輸入,並將每個單詞放在遇到\\ n的數組中時的位置。 然后輸出單詞。 當數組包含少於3個\\ n時,它可以工作,但是如果輸入中有3個\\ n,它會給我分段錯誤。 這是我編寫的代碼,請幫忙。 我是編程新手,所以請嘗試保持代碼完整無缺。

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

int main()
{
  int out=0;
  int in=0;
  char **arr2D;
  int i;
  int flag = 1;
  arr2D=(char**)malloc(out*sizeof(char*));
  for(i=0;i<out;i++)
    arr2D[i]=(char*)malloc(in*sizeof(char*));

  while (!feof(stdin))
    {
      in = in +1;
      arr2D[out]=(char*)realloc(arr2D[out],(in)*sizeof(char*));
      scanf("%c",&arr2D[out][i]);

      i=i+1;
      if(arr2D[out][i-1]=='\n')
        {
        out=out+1;
        arr2D=(char**)realloc(arr2D,out*sizeof(char*));
        i=0;
        in=0;
        }
    }

  int out2=0;
  int in2=0;
  do
    {
      do
        {
          printf("%c",arr2D[out2][in2]);
          in2++;
        }
      while(in2<=in-1);
      out2++;
      in2=0;
    }
  while(out2<=out);

  printf("\n");
  return 0;
}

以下代碼正常工作:

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


int main(int argc, char *argv[])
{
    int out = 1;
    int in = 1;
    char **arr2D;
    int i = 0;

    arr2D = malloc(out * sizeof(char *));
    for (i = 0; i < out; i++)
          /* IMPORTANT */
          arr2D[i] = malloc(in * sizeof(char));

    while (!feof(stdin)) {

        scanf("%c", &arr2D[out - 1][in - 1]);

        in++;
        if (arr2D[out - 1][in - 2] == '\n') {
            arr2D[out - 1][in - 2] = '\0';
            out++;
            arr2D = realloc(arr2D, out * sizeof(char *));
            /* IMPORTANT */
            arr2D[out - 1] = NULL;
            in = 1;
        }

        /* IMPORTANT */
        arr2D[out - 1] = realloc(arr2D[out - 1],in * sizeof(char));


    }

    int out2 = 0;
    do {
        printf("%s\n", arr2D[out2++]);
    } while(out2 < out);
    printf("\n");
    return 0;
}

您尚未在while循環中正確初始化變量i

int i;
scanf("%c",&arr2D[out][i]);

首先,為out元素分配一個緩沖區,然后使用realloc()第一行中超出范圍的arr2D[out] 請記住,在C中對數組int arr[size]索引總是從0size-1arr[size]永遠都不行。

供參考:分配行是第一個malloc()調用:

arr2D=(char**)malloc(out*sizeof(char*));

而第一個未定義行為的行是while()循環中的第二行:

arr2D[out]=(char*)realloc(arr2D[out],(in)*sizeof(char*));

在第一個while()循環中。 這就是調用未定義行為的點,之后允許發生任何事情。

帕拉姆(Parham)的方法似乎行得通。我還發現了另一種方法,盡管林尚不確定這樣做是否有問題,但它確實有效。

在分配或重新分配的時間上,我乘以* sizeof(char)來購買一個很大的緩沖區大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM