gpt4 book ai didi

C 编程 - 基于矩阵的函数不起作用

转载 作者:行者123 更新时间:2023-11-30 15:48:57 26 4
gpt4 key购买 nike

在我当前正在编写的程序中,我有一个函数,它读取输入并将每一行存储在字符数组的条目中。 n 是先前在输入中给出的数字,表示要读取的行数。

char **linelist(int n)
{
int i, j;
char **list;
list = calloc(n, sizeof(char *));
for (j = 0; j < n; j++){
list[j] = calloc(MAX_STR, sizeof(char));
}
for (i = 0; i < n; i++){
fgets(list[i], (MAX_STR), stdin);
}
return list;
}

此函数似乎工作正常,因为某个命令的输出应该给出输入,因为输出始终与测试中的假定输出匹配。

然后,我们有以下函数,它接收上述函数返回的数组,并将行进一步分割为单词,生成一个二维矩阵,该矩阵有 n 行,对应于输入中的行数,以及它们在 list 中的数量,以及任意数量的行,每行的单词存储在每个条目中。

char ***createmat(int n, char **list)
{
char ***matrix;
int i, x, j, k, l, y, z;
char *buffer;
const char separators[] = {' ','\t',',',';','.','?','!','"','\n'};
printf("F0\n");
buffer = calloc(MAX_STR, sizeof(char));
y = 0;

matrix = calloc(n, sizeof(char**));
for(z = 0; z < n; z++) {
matrix[z] = calloc(n, sizeof(char*)); // line 100
for(i = 0; i < n; i++) {
matrix[z][i] = calloc(MAX_STR, sizeof(char));
}
}
printf("F1\n");
for(x = 0; x < n; x++){
for(j = 0, l = 0; list[x][j] != '\0'; j++, l++){
buffer[l] = tolower(list[x][j]);
for(k = 0; k < 9; k++){
if(list[x][j] == separators[k]){
if(l != 0){
buffer[l] = '\0';
printf("F2\n");
stringcpy(buffer,matrix[x][y++]); //line 114
printf("F3\n");
}
l = -1;
}
}
}
matrix[x][y+1] = "\n";
}
printf("F4\n");
return matrix;
}

这个函数首先为matrix分配内存,这个过程在Valgrind中不会引发任何错误。问题似乎出在应该分离和存储单词的部分。根据测试,当每一行只有一个单词时,它似乎可以工作,但当任何行有多个单词时,它就不起作用。放入 printf 语句是为了调试目的并在终端中运行以下输入:

3  //what the functions receive as int n - the number of lines
the sky
is pink and yellow and
not uncute

给出以下输出:

F0
F1
F2
F3
F2
F3
F2
F3
F2
Segmentation fault (core dumped)

至于在 Valgrind 中运行它会返回以下内容:

==7599== Invalid read of size 8
==7599== at 0x400D01: createmat (proj.c:114)
==7599== by 0x4015A7: main (proj.c:241)
==7599== Address 0x5201428 is 0 bytes after a block of size 72 alloc'd
==7599== at 0x4C2ABB4: calloc (vg_replace_malloc.c:593)
==7599== by 0x400BBC: createmat (proj.c:100)
==7599== by 0x4015A7: main (proj.c:241)
==7599==
==7599== Invalid read of size 1
==7599== at 0x40087D: stringcpy (proj.c:12)
==7599== by 0x400D16: createmat (proj.c:114)
==7599== by 0x4015A7: main (proj.c:241)
==7599== Address 0x0 is not stack'd, malloc'd or (recently) free'd

stringcpy函数如下:

void stringcpy(char *s, char *t)
{
while ((*s++ = *t++) != '\0'); //line 12
}

我一直试图找出问题所在,但无济于事,因为我在 C 方面的经验很少。任何帮助将不胜感激。谢谢。

最佳答案

一个可能的问题是变量y似乎永远不会重置为零。当到达行尾时,似乎应该将其重置为零。

另一种可能性是,如果给定行中有超过 n 个单词,那么将导致写入超出分配的内存末尾。

编辑基于stringcpy源的添加,看来您在调用中向后调用了参数。我认为应该是:

stringcpy(matrix[x][y++],buffer);  //line 114

请注意,以下行会导致内存泄漏(常量字符串 "\n" 的赋值会导致指向该位置已分配内存的指针丢失:

    matrix[x][y+1] = "\n";

关于C 编程 - 基于矩阵的函数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16527536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com