c语言 - 我正在尝试使用 malloc 制作一个字符数组数组,然后使用



>我使用 malloc 创建了数组指针,并试图用文本文件中的字符串填充,但是当我运行程序时,我遇到了分段错误。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
  char *filename = "textfile.txt";
  int rows = 10;
  FILE *fp;
  char* line = NULL;
  size_t length = 0;
  ssize_t read;

  //make a 10 line *char array 
  char **aPointer = (char**)malloc(sizeof(char*)*rows);
  if ((aPointer = NULL))
  {
    printf("Memory errorn");
    exit(1);
  }
  //open file
  if ((fp = fopen(filename, "r")) == NULL)
  {
    fprintf(stderr, "Error opening file");
    exit(1);
  }
//read line from file to array
  int i = 0;
  while(((read = getline(&line, &length, fp)) != -1) && (i<rows))
  {
    strcpy(aPointer[i], line);
    i++;
  }
  return 0;
}
-

分段故障(核心倾倒)-

如何填写数组?

以下是导致错误的很可能原因:

strcpy(aPointer[i], line);

您实际上并没有初始化aPointer[i]因此aPointer[i]的值是不确定的。使用此值会导致未定义的行为,并且由于它用作指针,因此很可能是崩溃。

一个快速的解决方案是在每次调用getline之前将line设置为 NULL,因为该函数随后将分配线路所需的空间,然后您可以分配

line = NULL;
while(i < rows && (read = getline(&line, &length, fp)) != -1)
{
    aPointer[i++] = line;
    line = NULL;
}

注意:我更改了while条件的顺序,以使用&&运算符的短路功能,如果您读取足够的行,则不读取一行。

完成后,不要忘记free分配的内存。

如果我

没记错的话,你的代码片段看起来像:

整数行 = 3;

夏亚**aPointer = (char**)malloc(sizeof(char*)*rows);

aPointer[0] = "asdasdfasdfasdf";

aPointer[1] = "asdfsdf";

aPointer[2] = "line";

printf(" aPointer0[%s],aPointer1[%s],

aPointer1[%s]",aPointer[0],aPointer[1],aPointer[2]);

没有任何问题。

Output:

aPointer0[asdasdfasdfasdf],aPointer1[

asdfsdf],aPointer1[line]

在上面的例子中,aPointer 只能有引用。如果要复制到其中,可以使用strcpy() 例如 strcpy(apointer[1],"myText");

您调用的 malloc 只是为指针分配内存,而不是字符串本身。

您可以对每个字符串执行 malloc 操作。 然后使用 strcpy 复制字符串,它应该可以工作。

 aPointer[0] = malloc(sizeof(char) * the_string_size_you_want);
 strcpy(apointer[0],"asdasdfasdfasdf");

问题是您正在使用尝试使用指针数组**apointer,同时仅为每行的指针分配大小。

尝试这样的事情

int sizeOfEachRow=50;  // This should be the maximum size of any line
// Create an array of pointers. 
// Note that individual element is still an uninitialize pointer
char **aPointer = (char**)malloc(sizeof(char*)*rows);
  --snipped--
while(((read = getline(&line, &length, fp)) != -1) && (i<rows))
  {
    // Assign memory to each pointer
    aPointer[i]=(char*)malloc(sizeof(char)*sizeOfEachRow);
    strcpy(aPointer[i], line);
    i++;
  }

相关内容

  • 没有找到相关文章