尝试在结构中创建newVector(数组2D)的核心转储

尝试在结构中创建newVector(数组2D)的核心转储,c,segmentation-fault,C,Segmentation Fault,因此,我试图在结构内部创建一个简单的二维数组,并读取文件中某些坐标的值 现在我已经有了所有的内部函数,当我试图获取“get_coords”函数的坐标时,我遇到了一个分段错误。如果我在“int main”上编写完全相同的代码,而不是使用函数,它就可以工作 代码: #include <stdio.h> #include <stdlib.h> // structure typede

因此,我试图在结构内部创建一个简单的二维数组,并读取文件中某些坐标的值

现在我已经有了所有的内部函数,当我试图获取“get_coords”函数的坐标时,我遇到了一个分段错误。如果我在“int main”上编写完全相同的代码,而不是使用函数,它就可以工作

代码:

            #include <stdio.h>
            #include <stdlib.h>

            // structure
            typedef struct coordinates{
                double **a;
            } coord;

            // counts the nmbr of points 
            int count(){
                int i;
                int a1, a2, a3;
                FILE *fp;
                fp = fopen("abc.txt", "r+");
                while (fscanf(fp, "%d %d %d", &a1, &a2, &a3) != EOF){
                    i++;
                    if (feof(fp)){
                        break;          
                    }   
                }
                fclose(fp);
                return(i);
            }

            // creates new structure with the right size of memory allocated
            coord *newVector(size_t s){
                coord *v;
                int j;
                v = malloc(sizeof(coord));

                v->a = malloc(sizeof(double*)*3);

                for (j=0; j<3; j++){
                    v->a[j] = malloc(sizeof(double)*s);
                }

            }

            void get_coords(coord *points){
                int i=0;
                FILE *fp;
                fp = fopen("abc.txt", "r+");
                while (fscanf(fp, "%le %le %le", &points->a[i][0], &points->a[i][1], &points->a[i][2]) != EOF){
                    i++;
                }
                fclose(fp);
            }


            int main(){
                int i = 0, j=0;

                coord *points;

                i = count();

                points = newVector(i);

                get_coords(points);

                for (i=0; i<3; i++){
                        printf("%lf %lf %lf\n", points->a[i][0], points->a[i][1], points->a[i][2]);
                }
            }
谢谢大家的帮助

卡姆普斯, 迪伦

PS:这只是我想要的原型。

count()
中,您正在递增一个未初始化的变量,调用未定义的行为(UB)

更改此项:

int count() {
  int i;
coord *newVector(size_t s) {
  ...
}
为此:

int count() {
  int i = 0;
coord *newVector(size_t s) {
  ...
  return v;
}

newVector()
未返回动态分配的内存

更改此项:

int count() {
  int i;
coord *newVector(size_t s) {
  ...
}
为此:

int count() {
  int i = 0;
coord *newVector(size_t s) {
  ...
  return v;
}

解决这些问题后,您应该会看到以下输出:

1.000000 2.000000 3.000000
4.000000 5.000000 6.000000
7.000000 8.000000 9.000000

这不是问题,但我将使用
%lf
作为
fscanf()
中的格式说明符,而不是
%le

此外,在
count()
中,此
返回(i)
与此相同
返回i。括号是多余的

TODO:释放动态分配的内存(我假设您跳过了提供MCVE的部分)


专业提示:下次编译时启用警告标志。在这种情况下,他们可能已经为您找到了问题所在。例如,在GCC中,我会得到:

gsamaras@myPc:~$ gcc -Wall  main.c
main.c: In function ‘main’:
main.c:51:28: warning: unused variable ‘j’ [-Wunused-variable]
                 int i = 0, j=0;
                            ^
main.c: In function ‘newVector’:
main.c:37:13: warning: control reaches end of non-void function [-Wreturn-type]
             }
             ^
最后一个警告是我回答中的第二点。

count()
中,您正在递增一个未初始化的变量,调用未定义的行为(UB)

更改此项:

int count() {
  int i;
coord *newVector(size_t s) {
  ...
}
为此:

int count() {
  int i = 0;
coord *newVector(size_t s) {
  ...
  return v;
}

newVector()
未返回动态分配的内存

更改此项:

int count() {
  int i;
coord *newVector(size_t s) {
  ...
}
为此:

int count() {
  int i = 0;
coord *newVector(size_t s) {
  ...
  return v;
}

解决这些问题后,您应该会看到以下输出:

1.000000 2.000000 3.000000
4.000000 5.000000 6.000000
7.000000 8.000000 9.000000

这不是问题,但我将使用
%lf
作为
fscanf()
中的格式说明符,而不是
%le

此外,在
count()
中,此
返回(i)
与此相同
返回i。括号是多余的

TODO:释放动态分配的内存(我假设您跳过了提供MCVE的部分)


专业提示:下次编译时启用警告标志。在这种情况下,他们可能已经为您找到了问题所在。例如,在GCC中,我会得到:

gsamaras@myPc:~$ gcc -Wall  main.c
main.c: In function ‘main’:
main.c:51:28: warning: unused variable ‘j’ [-Wunused-variable]
                 int i = 0, j=0;
                            ^
main.c: In function ‘newVector’:
main.c:37:13: warning: control reaches end of non-void function [-Wreturn-type]
             }
             ^

最后一个警告是我回答中的第二点。

您忘记在
newVector
函数中返回
v

        // creates new structure with the right size of memory allocated
        coord *newVector(size_t s){
            coord *v;
            int j;
            v = malloc(sizeof(coord));

            v->a = malloc(sizeof(double*)*3);

            for (j=0; j<3; j++){
                v->a[j] = malloc(sizeof(double)*s);
            }

            return v;

        }
//使用分配的正确内存大小创建新结构
坐标*新向量(大小){
合作*v;
int j;
v=malloc(sizeof(coord));
v->a=malloc(sizeof(double*)*3);
对于(j=0;ja[j]=malloc(sizeof(double)*s);
}
返回v;
}

您忘记在
newVector
函数中返回
v

        // creates new structure with the right size of memory allocated
        coord *newVector(size_t s){
            coord *v;
            int j;
            v = malloc(sizeof(coord));

            v->a = malloc(sizeof(double*)*3);

            for (j=0; j<3; j++){
                v->a[j] = malloc(sizeof(double)*s);
            }

            return v;

        }
//使用分配的正确内存大小创建新结构
坐标*新向量(大小){
合作*v;
int j;
v=malloc(sizeof(coord));
v->a=malloc(sizeof(double*)*3);
对于(j=0;ja[j]=malloc(sizeof(double)*s);
}
返回v;
}


使用所有警告和调试信息进行编译(
gcc-Wall-Wextra-g
使用…)。改进代码以避免出现警告。读取。使用。给出一个什么是abc.txt文件?abc.txt文件只是一个带有一些坐标的txt文件(只是一个示例)@BasileStrynkevitch这几乎是一个MCVE!@Yunnosch谢谢你的评论。正如我所说的,当我把所有东西都放在“int main”中时,这个程序就可以运行了,但一旦我将代码分成函数,它就停止工作,编译时会有所有警告和调试信息(
gcc-Wall-Wextra-g
with…)。改进您的代码以避免出现警告。读取。使用。给出一个什么是abc.txt文件?abc.txt文件只是一个带有一些坐标的txt文件(只是一个示例)@BasileStrynkevitch这几乎是一个MCVE!@Yunnosch谢谢你的评论。正如我在问题中所说的,当我把所有东西都放在一个“int main”中时,程序就会工作,但一旦我把代码分成函数,它就会停止工作。谢谢,但它仍然不能解决我的分段错误。编辑问题OK@DylanLopes,回答更新,问题已解决。我回滚了您的编辑,因为它使我的答案无效。:)如果您有任何问题,请告诉我。@DylanLopes欢迎您。我认为此带有编译器警告的编辑非常有用…PS:不是一个很大的失败,只是一个可能会为您触发新知识的错误(例如下次启用警告的编译!);)PPS:你的MCVE是完美的,除了不是故意的。谢谢你的提示;)现在我有一个问题,如果我尝试从这个文件读取坐标:。我有一个分割错误。如果你能帮忙,请;)PS:很抱歉上传了这个文件,但它确实很长。好吧,我搞错了,我给无限多行分配了内存,而不是行,我只是改变了它,它工作了,对所有@gsamarasYou是对的,谢谢,但它仍然不能解决我的分段错误。编辑问题OK@DylanLopes,更新答案,解决问题。我回滚了您的编辑,因为它使我的答案无效。:)如果你有任何问题,请告诉我。。欢迎@DylanLopes。我认为这个带有编译器警告的编辑非常有用。。。PS:这不是一个很大的失败,只是一个可能为您触发新知识的错误(比如下次编译时启用警告!);)PPS:你的MCVE是完美的,除了不是故意的。谢谢你的提示;)现在我有一个问题,如果我尝试从这个文件读取坐标:。我有一个分割错误。如果你能帮忙,请;)PS:很抱歉上传了这个文件,但它确实很长。好吧,我搞错了,我是为无限多行而不是行分配内存,我只是改变了它,它工作了,那个