>我使用 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";
aPointer1[%s]",aPointer[0],aPointer[1],aPointer[2]);
没有任何问题。
Output:
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++;
}