Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C “一元*”的类型参数无效(具有“int”)。基本上,我在指针和结构的逻辑方面遇到了问题_C_Pointers_Struct - Fatal编程技术网

C “一元*”的类型参数无效(具有“int”)。基本上,我在指针和结构的逻辑方面遇到了问题

C “一元*”的类型参数无效(具有“int”)。基本上,我在指针和结构的逻辑方面遇到了问题,c,pointers,struct,C,Pointers,Struct,我这里有这段代码,它给了我编译器错误,我知道这里有几十个其他问题的标题基本上完全相同;我已经通读了不少,但还没有回答我所有的问题。在过去的几天里,我在stackoverflow和教学网站上读了很多关于指针和结构的书,还有几十本,我觉得我只需要一个物理例子就可以了。我觉得我知道这些东西的大部分,但我对自己的信心比我想的要大得多。如果有人能帮我弄清楚到底发生了什么。我已经在下面贴了一个编号的列表,告诉你我认为正在发生的事情,让我们希望我在大部分情况下是正确的,少解释你不得不做的事情,哈哈,只是开个玩

我这里有这段代码,它给了我编译器错误,我知道这里有几十个其他问题的标题基本上完全相同;我已经通读了不少,但还没有回答我所有的问题。在过去的几天里,我在stackoverflow和教学网站上读了很多关于指针和结构的书,还有几十本,我觉得我只需要一个物理例子就可以了。我觉得我知道这些东西的大部分,但我对自己的信心比我想的要大得多。如果有人能帮我弄清楚到底发生了什么。我已经在下面贴了一个编号的列表,告诉你我认为正在发生的事情,让我们希望我在大部分情况下是正确的,少解释你不得不做的事情,哈哈,只是开个玩笑。这是密码

struct foo{
    int num;
    char  *word;
    struct foo *ptr;
};

void func1(struct foo*);
void func2(struct foo);

int main() {

    struct foo a;
    a.num = 20;
    a.word = "wordOne";
    func1(&a);
    printf("%d %s", a.num, a.word);       // refer to #3 below.

    a.ptr = &a;
    a.num = 55;
    a.word = "thirdToLastWord";
    func2(a);
    printf("%d %s\n", a.num, a.word);
}

void func1(struct foo *a)
{
    while(*(a->word) != '\0')
        {
            putchar(*(a->word));
            a->word++;
        }
    putchar('\n');
    if(a->num % 10 != 0)
        { a->num *= 2; }
    a->word--;
    printf("num equals %d\n", (*a).num);
}

void func2(struct foo a)
{
    if((*a).num == a->ptr->num)               //compiler error
        {(*a).num = (*((*a).ptr)).num +1; }   //compiler error
    else    {   a->num = 200;   }
    a->word = "wordsix";
    a->ptr->word = "wordseven";
    printf("function 2 %d %s\n", (*a).num, (*((*a).ptr)).word);}
}
嗯。所以我想我理解了第一个函数。但是如果我错了,或者我对它为什么这么做的理解有误,请纠正我下面的任何一个问题

1在main func1之前,将结构foo声明为指针。调用func1时,我们传入一个的地址,以便知道指向哪个地址

2 func1中的所有内容都将更改原始结构。在func1之外打印时,该单词将递减,仅显示最后一个字母e

3在我评论的第3行中,它打印出的是原始结构foo的.num,而不是指针版本,即使它们是相同的东西

我希望到目前为止我没有搞砸

4确定,因此a.ptr=&a将原始foo结构中的struct var struct foo*ptr with设置为等于a的地址;这恰好是指针结构foo*ptr发现自己所在的结构。对吧?

我们将他称为主要/原始结构的成员,他已被确定为主要结构上方的指针

6那么,这是否会在结构内部形成一个无限循环的结构,这些结构通过自身内部的指针链接在一起

我评论编译器错误的地方就是我肯定我有问题的地方

7首先,在设置a.ptr=&a;我们将一个带有初始化指针ptr的struct副本传递给函数func2,是吗

8在第一个if stmt中,看起来我们正在将一个->单词与一个->ptr->num进行比较。我假设它的意思是:如果{属于a所指向的结构的成员单词等于member num,属于ptr所指向的结构,ptr再次被指针a所指向}这似乎是对的,但我认为不是

9如果这是真的,那么下面的一行表示完全相同的事情,加上+1

10我想最后main中的printf打印出进入func2之前的num和word,或者func2中的一些指针改变了它们的值

我非常感谢您对我应该如何将指针和结构ptr->member和/或structure.member的内容植入我头脑中的所有反馈和建议

另外,我不确定我的问题中是否出现了这种情况,但我对双指针也相当不确定。如果不太麻烦的话,有人能告诉我双指针是如何集成到我的代码中的吗


谢谢

a不是指针。您在许多情况下使用->运算符访问非指针结构成员,这会导致错误

您的代码中有许多错误。例如,您没有为*word分配内存。但在其中存储一个值:

a.word = "wordOne";
您应该以.num的形式访问结构成员num


这里有一个关于使用的教程,它可能会帮助您理解它。

这段代码中确实有很多错误,为了清晰起见,我将尝试浏览您的列表

一,。是的,您可以在此处传递指针,但在取消引用指针参数之前必须检查NULL。如果你现在就养成这样做的习惯,你就可以省下无数个小时追踪分段错误的来源

二,。func1不更改->数值

另外,Blue Moon关于->单词是正确的,这可以通过两种方法之一正确完成

在全球范围内:

const char *global = "wordOne";

int main(int argc, char *argv[]) {
  a.work = (char*)global;
  /*...*/
}
或者蓝色月亮所指的首选方式:

const char *global = "wordOne";

int main(int argc, char *argv[]) {
  size_t sz = sizeof(global);
  a.work = (char*)malloc(sz);
  for(int i = 0; i < sz; i++) { a.work[i] = global[i]; }
  /*...*/
}
我真的希望这有助于澄清问题!:-

const char *global = "wordOne";

int main(int argc, char *argv[]) {
  size_t sz = sizeof(global);
  a.work = (char*)malloc(sz);
  for(int i = 0; i < sz; i++) { a.work[i] = global[i]; }
  /*...*/
}
void func2(struct foo);
// struct foo is passed 'by value'