我有一个这样的结构:

typedef struct{
    char *lexema;
    int comp_lexico;
    union{
        double v;
        double (*fnctptr)();
    } valor;
}tipoelem;

struct celda {
    tipoelem info;
    struct celda *izq, *der;
};

typedef struct celda * abb;

然后我定义了一个全局变量abb,它有一个全局范围如果我以某种方式得到celda字段信息的内存方向,我是否能够安全地修改它,或者最好将该字段定义为tipoelem指针,例如(tipoelem *info)
问题是,用prrogram其他部分的tipoelem info来编辑tipoelem *pointerToInfo字段是安全的还是最好在struct celda中将其声明为指针tipoelem *info
编辑更多信息:
我想修改的方式是下一个,我不知道它是否安全。
abb a;
int main(){
    tipoelem *ptr = a->info;
    ptr->comp_lexico = 2;
}

最佳答案

是的,这样进出是安全的。
举个例子,

#include<stdio.h>

struct stOne {
    int a;
    int b;
    char c;
};

struct stTwo {
    struct stOne ObjectOne;
    struct sttwo *pTwo;
};

struct stOne *pOne;
struct stTwo *pTwo;
struct stTwo ObjectstTwo;

int main() {

    pTwo = &ObjectstTwo;
    pTwo->ObjectOne.c = 'H';
    printf("%c", ObjectstTwo.ObjectOne.c);

    pOne = &pTwo->ObjectOne;
    pOne->c = 'D';
    printf(" %c", ObjectstTwo.ObjectOne.c);
}

此代码打印
H

作为输出。
类似地,您可以修改struct tipoelem的成员,例如comp_lexico,它是一个int
struct celda objectCelda;

//Assuming abb is a pointer, Make abb point to an object
abb = &objectCelda;

//Modify the value of comp_lexico
abb->info.comp_lexico = 0xAA;

现在更改代码,
#include<stdio.h>

struct stOne {
    int a;
    int b;
    char c;
};

struct stTwo {
  struct stOne ObjectOne;
  struct sttwo *pTwo;
};

struct stOne *pOne;
struct stTwo *pTwo;
struct stTwo ObjectstTwo;

int main() {

    pTwo = &ObjectstTwo;
    pTwo->ObjectOne.c = 'H';
    printf("%c", ObjectstTwo.ObjectOne.c);

    pOne = &pTwo->ObjectOne;
    pOne->c = 'D';
    printf(" %c", ObjectstTwo.ObjectOne.c);
}

这个指纹
H D

作为输出在控制台上所以无论哪种方式都是完全可以的。

关于c - 指向结构内部变量的指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47304208/

10-10 07:58