c - 无法在 C 中正确使用结构指针

标签 c arrays pointers struct

我是 C 语言的初学者,目前正在为在函数中使用结构而苦苦挣扎。即使我为我的函数提供了指向我的结构的指针并使用它来更改它们的值,但我的函数似乎无法更改指针本身的值

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

typedef struct Vector
{
    int n;
    double *entry;
}Vector; 

//defining the struct vector with n for its length and entry as a pointer which will become an array for its values
Vector *newVector(int n)
{
    int i = 0;
    Vector *X = NULL;
    assert(n > 0);
    X = malloc(sizeof(Vector));
    assert(X != NULL);
    X->n = n;
    X->entry = malloc(n+1*sizeof(double));
    assert(X->entry != NULL);
    X->entry[0] = 0;
    for (i=1; i<n+1; ++i) {
        scanf("%lf",&X->entry[i]);
    }
    return X;
}

//making  a new vector struct from the size given and returning its pointer (the array is made so it goes from 1-n instead of 0-(n-1)
void delVector(Vector *X)
{
    assert(X != NULL);
    assert(X->entry != NULL);
    free(X->entry);
    free(X);
    X = NULL;
}

int getVectorLength (Vector *X)
{
    assert(X != NULL);
    return X->n;
}

void setVectorLength(Vector *X, int k)
{
    assert(X != NULL);
    assert(k>0);
    delVector(X);
    printf("so far.\n");
    X = newVector(k);
} //deleting the vector and then replacing it with the new sized vector

double getVectorEntry (Vector *X, int h)
{
    return X->entry[h];
}

void setVectorEntry (Vector *X, int h)
{
    printf("Value %d.\n",h);
    scanf("%lf",&X->entry[h]);
}

main()
{
    Vector *h = NULL;
    h = newVector(3);
    printf("%f\n",h->entry[1]);
    printf("%f\n",getVectorEntry(h,1));
    setVectorEntry(h,1);
    printf("%f\n",getVectorEntry(h,1));
    printf("%d\n",getVectorLength(h));
    setVectorLength(h,6);
    printf("%f\n",getVectorEntry(h,6));
    setVectorEntry(h,6);
    printf("so far.\n");
    printf("%f\n",getVectorEntry(h,6));
}

运行代码会使它在到达 delVector 时崩溃。如果我要注释掉 delVector,它会在 X = newVector(k); 崩溃,原因我也找不到(它启动函数 newVector,但在我可以输入之前崩溃)。那么是什么导致了错误呢? 非常感谢!

最佳答案

让我们只关注 setVectorLength 函数

void setVectorLength(Vector *X, int k)
{
    assert(X != NULL);
    assert(k>0);
    delVector(X);
    printf("so far.\n");
    X = newVector(k);
}

这里,Vector *X 是一个局部变量,只存在于这个函数中。它指向内存中的某个位置,但使用它不能修改原始指针。所以有两种解决方法。 1. 您不删除并重新创建 vector 。而是做这样的事情

void setVectorLength(Vector *X, int k)
{
    X->entry = realloc(X->entry, k*sizeof(double)); // frees X->entry and allocates it to a new heap array
    X->k = k;
}

2。使用指针指针。请注意,这会变慢并且没有必要。寻求第一种解决方案。

void setVectorLength(Vector **X, int k)
{
    assert(*X != NULL);
    assert(k>0);
    delVector(*X);
    printf("so far.\n");
    *X = newVector(k);
}

变量Vector **X指向原变量,可以修改。

关于c - 无法在 C 中正确使用结构指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40768032/

相关文章:

c# - 索引超出数组范围 - 整数

c++ - 在这里出现 'sigbrt'错误的原因是什么?

c - 通过函数中的指针修改结构成员

c - 什么是 OpenCV FindChessboardCorners 约定?

c - 读取 C 中引号之间有空格的用户输入字符串并保留引号

java - 在 Java 中实现 ArrayList 并获取各个值

c - 如何在 C 中将 char* 添加到 char**

c - c 中的匿名代码块

创建具有 block 大小的共享 vector ?

arrays - 向量。<> vs 数组