C:使用 strcpy 将字符串分配给结构数组引起的隔离错误



我正在读取一个包含 10 行和 3 列的文本文件。每个元素都需要放入数组中以进行进一步操作。fileToArray 方法将挑出每个字符串,我可以单独成功打印每个字符串,但我似乎无法将字符串正确分配给每个索引。

我的理解是我有一个指向 10 个 dataArray 的指针,在我的 switch 语句中,本质上发生的是 dataArray[0].pName = P1 ...dataArray[1].pName = P2 ...等。。。结构中的其他变量也是如此。

文本文件最多有 10 行,因此为什么要初始化 10 个数组。

我的理解有缺陷还是我的代码中存在一些明显的错误?

struct Processes
{
char *pName;
char *arvTime;
char *srvTime;
};
void fileToArray(FILE *fp, struct Processes dataArray[])
{
// temp[14] because 14 is the max size a line can be
char temp[14];
char delim[] = " n";
int count = 0;
int a, b, c = 0;
while(fgets(temp, 14, fp) != NULL)
{
char *ptr = strtok(temp, delim);
while(ptr != NULL)
{
// printf("'%s'n", ptr);
// ^^^^ This line will successfully print out each string
switch(count)
{
case 0:
dataArray[a].pName = malloc(strlen(ptr + 1));
strcpy(dataArray[a].pName, ptr);
a++;
count++;
free(dataArray[a].pName);
break;
case 1:
dataArray[b].arvTime = malloc(strlen(ptr + 1));
strcpy(dataArray[b].arvTime, ptr);
b++;
count++;
free(dataArray[b].arvTime);
break;
case 2:
dataArray[c].srvTime = malloc(strlen(ptr + 1));
strcpy(dataArray[c].srvTime, ptr);
c++;
count = 0;
free(dataArray[c].srvTime);
break;
}

ptr = strtok(NULL, delim);
}
}
}
int main(int argc, void *argv[])
{
struct Processes dataArray[10];
if(argc == 1)
{
FILE *fp;
fp = fopen("process-data.txt", "r");
fileToArray(fp, dataArray);
fclose(fp);
}
return 0;
}
// Sample text file being read //
P1 1 5
P2 2 2
P3 11 5
P4 17 9
P5 3 1
P6 10 10
P7 4 3
P8 4 1
P9 7 8
P10 5 4

运行此代码会导致段错误,我不确定原因。查看其他类似的帖子,解决方案似乎没有使用 malloc((,这让我认为我错误地实现了该功能。

这段代码与你的想法完全相反

malloc(strlen(ptr + 1))

它不是为字符串分配足够的空间,而是为末尾的 NUL 分配 1 个额外的空间,而是分配比字符串长度少一个的空间。您想像这样将+ 1移动到呼叫strlen的外部

malloc(strlen(ptr)+1)

此外,您应该将ab的值初始化为 0 或更好,将abc合并为一个变量,并且仅在您阅读第 3 条信息时才递增它。

对于初学者,您应该将数组中的元素数传递给函数。所以函数声明应该看起来像

void fileToArray( struct Processes dataArray[], size_t n, FILE *fp );

当函数返回数组的填充元素的数量时会更好。

size_t fileToArray( struct Processes dataArray[], size_t n, FILE *fp );

并且该函数至少可以像

size_t n = fileToArray( dataArray, 10, fp );

在本声明中

int a, b, c = 0;

仅初始化变量c。所有其他变量 a 和 b 均未初始化。所以例如这个陈述

dataArray[a].pName = malloc(strlen(ptr + 1));

导致未定义的行为。

此表达式

malloc(strlen(ptr + 1))

无效。它相当于

malloc(strlen( &ptr[1] ))

并且在分配内存后立即释放内存没有任何意义。

free(dataArray[a].pName);

该函数可以通过以下方式定义

size_t fileToArray( struct Processes dataArray[], size_t n, FILE *fp )
{
// temp[14] because 14 is the max size a line can be
char temp[14];
char delim[] = " n";
size_t i = 0;
for( ; i < n && fgets( temp, sizeof( temp ), fp) != NULL; i++ )
{
dataArray[i].pName   = NULL;
dataArray[i].arvTime = NULL;
dataArray[i].srvTime = NULL;
char *ptr = strtok( temp, delim );
for( size_t j = 0; j < 3 && ptr != NULL; j++ )
{
switch ( j )
{
case 0:
dataArray[i].pName = malloc( strlen( ptr ) + 1 );
strcpy( dataArray[i].pName, ptr );
break;
case 1:
dataArray[i].arvTime = malloc( strlen( ptr ) + 1 );
strcpy( dataArray[i].arvTime, ptr );
break;
case 2:
dataArray[i].srvTime = malloc( strlen( ptr ) + 1 );
strcpy( dataArray[i].srvTime, ptr );
break;
}
ptr = strtok( NULL, delim );
}
}
return i;
}

相关内容

  • 没有找到相关文章