c - 如何在C中正确实现动态数组

标签 c dynamic-arrays

我尝试用 C 语言编写一个简短的程序,该程序从标准输入中获取空格分隔的 token ,对 token 进行洗牌(排列),然后将洗牌 token 打印到标准输出。我的洗牌算法工作正常,问题在于 token 解析。我想将 token 存储在动态字符串数组中,以便程序可以支持通过标准输入传入任意数量的 token 。但是,每当需要扩展数组时,我当前的动态数组实现都会导致段错误。我做错了什么?

我的代码:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFERSIZE 33

int main(int argc, char* argv[]) {
  int i,j,k;
  i=j=k=0;
  int arrSize = 10;
  /* Temp fix */
  /* Get token count as command line argument */
  //if (argc==2) { sscanf(argv[1],"%d",&arrSize); }
  char  c='\0';
  char* t;
  char** datArr = (char**)malloc(sizeof(char*)*arrSize);
  //char* datArr[arrSize];
  char  token[BUFFERSIZE];
  while ( (c=getc(stdin)) != EOF && c != '\0') {
    if(isspace(c)) {
      token[i] = '\0';
      i=0;
      if ( j >= arrSize) {
        arrSize *= 2;
        realloc(datArr, arrSize);
      }
      char* s = (char*)malloc(sizeof(char[BUFFERSIZE]));
      strcpy(s,token);
      datArr[j++] = s;
    }
    else if(i+1 < BUFFERSIZE) {
      token[i++] = c;
    }
  }
  /* Permutate & Print */
  srand(time(NULL));
  for(i=0;i<j;++i) {
    k = rand()%(j-i);
    t = datArr[k];
    datArr[k] = datArr[j-i-1];
    datArr[j-i-1] = t;
  }
  for(i=0;i<j;++i) { printf("%s ",datArr[i]); }
  printf("\n");
  return 0;
}

注意:我知道我已经释放了内存

一些示例输入(以保持卡片主题):

2C 3C 4C 5C 6C 7C 8C 9C 10C JC KC QC AC 2S 3S 4S 5S 6S 7S 8S 9S 10S JS KS QS AS

最佳答案

您是否尝试过测试:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFERSIZE 33

int main(int argc, char* argv[]) {
  int i,j,k;
  i=j=k=0;
  int arrSize = 10;
  /* Temp fix */
  /* Get token count as command line argument */
  //if (argc==2) { sscanf(argv[1],"%d",&arrSize); }
  char  c='\0';
  char* t;
  char** datArr = (char**)malloc(sizeof(char*)*arrSize);
  //char* datArr[arrSize];
  char  token[BUFFERSIZE];
  while ( (c=getc(stdin)) != EOF && c != '\0') {
       // Just read the file
  }
}

我认为这是一个无限循环。

getc() 返回一个 int,而不是一个 char,因此它永远不应该停止读取文件,这是一个无限循环。这将耗尽内存,并最终导致段错误。

我建议将 char c='\0'; 更改为 int c; 并应用内存处理方面的改进。

关于c - 如何在C中正确实现动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13223137/

相关文章:

c++ - 当动态数组超出范围时是否释放内存

c++ - 长双二维动态数组C++

javascript - 在 View Angular2 中渲染动态数组

c - 动态数组 : Separating Numbers into Even and Odd Using C

c++ - 在 const char* [][3] 和 std::array< const char*, 3 >* 之间转换

c - 在 C 中使用 pow() 有问题

C++ 对象在内存中是连续的吗?

c - 结构体中动态数组的迭代器

将 char 指针数组的值复制到结构中

c - 指针数组,停止运行