我试图通过引用传递数组,该函数将从预定义的值列表中添加数据。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ARR_SIZE 7
char* names[ARR_SIZE]= {"Simon", "Suzie", "Alfred", "Chip", "John", "Tim", "Harriet"};
int ages[ARR_SIZE]= {22, 24, 106, 6, 18, 32, 24};
typedef struct {
char* name;
int age;
} person;
static void insert(person*, char*, int);
int main(int argc, char* argv[]) {
person* people = (person*) malloc(ARR_SIZE * sizeof(person));
for (int i = 0; i < ARR_SIZE; ++i) {
insert(&people[i], names[i], ages[i]);
}
for (int i = 0; i < ARR_SIZE; ++i) {
printf("Person #%d: (Name: %s; Age: %d)\n", i + 1, people->name, people->age);
}
return 0;
}
static void insert(person* next, char* name, int age) {
next->name = name;
next->age = age;
}
然而,当我运行此代码时,我得到的数组中填充了第1个人和第1个年龄。
Person #1: (Name: Simon; Age: 22)
Person #2: (Name: Simon; Age: 22)
Person #3: (Name: Simon; Age: 22)
Person #4: (Name: Simon; Age: 22)
Person #5: (Name: Simon; Age: 22)
Person #6: (Name: Simon; Age: 22)
Person #7: (Name: Simon; Age: 22)
我尝试了一种不同的方法,通过调用insert(&people, i, names[i], ages[i]);
并将方法签名修改为void insert(person** next, int position, char* name, int age);
。当然,我也修改了方法中的代码,但这不是重点。编译是成功的,但是,就像以前的方法一样,我在整个阵列中只得到一个人和一个年龄。这一次,不是第一次,而是最后一次!
我对此感到茫然。我真的以为我对指针的工作方式有了一般性的了解,但这只是证明我错了。我真的很感激这个主题的任何帮助。
提前谢谢。
答案 0 :(得分:4)
您的打印循环始终将相同的值传递给people[i].name
。您想要打印people[i].age
和var object = {
foo: 'bar',
method: function(){
var context = this;
$.get('/some/async/api', function (req, res){
console.log(context.foo); //==> bar
});
}
}
。
答案 1 :(得分:2)
您应该按照people
打印时移动指针people ++
,以便打印所有值。
或
只需使用
people[i].age
和people[i].name