【问题标题】:structs , pointers and changing them结构体、指针和改变它们
【发布时间】:2014-01-31 13:01:20
【问题描述】:

我对 C 编程很陌生,但对其他语言有一些经验。

我目前正在学习结构和指针。我的任务是使用结构和指针对一些名称进行排序。

我首先创建了一个结构和一个函数来交换两个名称。当我想用结构声明一个数组时,我就是不知道出了什么问题。

这是我编译时遇到的错误:

pr.c:29:22: error: expected expression
        studenten[i]={s[i][0],s[i][1],s[i][2]};
                 ^
1 error generated.

这里有一些代码:

#include <stdio.h>
#define MAXSTUDENT 2

typedef struct {
    char *firstname;
    char *pre;
    char *lastname;
} student;

void swap(student **a,student **b) {
    student *temp;
    temp=*a;
    *a=*b;
    *b=temp;   
}


int main () {
    int i;
    char *s[MAXSTUDENT][3]={{"John"," the ","Way"},{"John"," ","Smith"}};
    student *studenten[MAXSTUDENT];

    for (i=0;i<MAXSTUDENT;i++) {
        studenten[i]={s[i][0],s[i][1],s[i][2]};
    }


    printf("%s%s%s    -     %s%s%s\n",studenten[0]->firstname,studenten[0]->pre,studenten[0]->lastname,studenten[1]->firstname,studenten[1]->pre,studenten[1]->lastname);
    swap(&studenten[0],&studenten[1]);
    printf("%s%s%s    -     %s%s%s\n",studenten[0]->firstname,studenten[0]->pre,studenten[0]->lastname,studenten[1]->firstname,studenten[1]->pre,studenten[1]->lastname);
}

【问题讨论】:

  • 到底是什么问题?你有错误吗?如果有,在哪里?
  • 添加到问题中,谢谢
  • 我们不允许与 strcpy 一起使用,我们必须使用指针来完成
  • @APerson 他正在交换swap中的指针。他使用它的方式,swap() 将交换两个数组位置(其中每个位置都是指向学生的指针)。它实际上并没有交换学生的名字,它交换了数组中的位置。所以是的,他在swap() 内部交换指针,但不确定这是否是他想要的。

标签: c sorting pointers struct


【解决方案1】:

这并不像你期望的那样工作:

studenten[i] = {s[i][0],s[i][1],s[i][2]};

成员初始化列表只在声明中有效,常规赋值不允许使用初始化列表。您必须手动完成,并自己分配内存:

for (i=0;i<MAXSTUDENT;i++) {
    studenten[i] = malloc(sizeof(*studenten[i]));
    if (studenten[i] == NULL) {
        /* Handle malloc error... */
    }
    studenten[i]->firstname = s[i][0];
    studenten[i]->pre = s[i][1];
    studenten[i]->lastname = s[i][2];
}

在任何一种情况下,请注意对于任何大于或等于 2 的is[i][j]0 - 您只初始化了 s[0]s[1]

【讨论】:

  • 我不再出现编译错误,但在运行时出现总线错误 (10)
  • 鉴于swap 接受student** 类型,传递学生指针的地址应该仍然有效吗?
  • 看来我的指针做错了,如果我将字符数组定义为 * 这意味着是一个指针,对吗?这意味着如果我稍后在 for 循环中使用它,我会将 s[i][x] 的指针传递给学生结构而不是实际的字符,对吧??
  • 它适用于“studenten[i] = malloc(sizeof(*studenten[i]));”,谢谢!但是我想知道为什么,我总是必须像这样用结构分配内存吗?
  • 你创建了studenten 一个指针数组。这就是为什么你必须自己做 malloc 的原因。将 studenten 声明为一个学生结构数组,然后传递其元素的地址以避免手动 malloc。
猜你喜欢
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多