了解语句中的数据分配系统
Understanding Data Allocation System in Statement
我一直无法理解以下语句:
struct term {
int data;
char word[200];
};
void read_in_terms(struct term **terms, int *pnterms, char *filename);
该函数接收一个指向 struct term 的指针、一个指向 int 的指针,以及格式如 cities.txt 的文件名。该函数为文件中的所有项分配内存,并在 *terms 中存储指向该块的指针。该函数将术语数存储在 *pnterms 中。该函数从文件名中读取所有术语,并将它们放在 *terms.
指向的块中
--
我附上了我认为这意味着什么的示意图。本质上,在堆中,我们为结构项的“数组”分配 space。并按如下方式访问:
int main(void) {
int terms = 2;
int *pnterms = &terms;
struct term *term_list = (struct term *)malloc(sizeof(struct term) * (*pnterms));
(term_list+0)->data = 1000;
strcpy((term_list+0)->word, "hello");
(term_list+1)->data = 2000;
strcpy((term_list+1)->word, "bye");
printf("%s \n", (term_list+1)->word);
}
这样对吗?
给出的描述基本上是正确的。 C 按值传递参数,而被调用函数必须修改的调用方作用域中的变量必须“按引用”传递。由于 C 中没有“引用”类型,这意味着将指针传递给变量。
以下是改写为使用 read_in_terms
的相同代码。
#include <malloc.h>
#include <string.h>
#include <stdio.h>
struct term {
int data;
char word[200];
};
void read_in_terms(struct term **terms, int *pnterms)
{
*pnterms = 2;
*terms = malloc(sizeof(struct term) * (*pnterms));
(*terms)[0].data = 1000;
strcpy((*terms)[0].word, "hello");
(*terms)[1].data = 2000;
strcpy((*terms)[1].word, "bye");
}
int main(void) {
int terms;
struct term *term_list;
read_in_terms(&term_list, &terms);
for(int n = 0; n < terms; n++)
printf("term[%d] data = %d, word = %s \n", n, term_list[n].data, term_list[n].word);
}
输出:
term[0] data = 1000, word = hello
term[1] data = 2000, word = bye
我一直无法理解以下语句:
struct term {
int data;
char word[200];
};
void read_in_terms(struct term **terms, int *pnterms, char *filename);
该函数接收一个指向 struct term 的指针、一个指向 int 的指针,以及格式如 cities.txt 的文件名。该函数为文件中的所有项分配内存,并在 *terms 中存储指向该块的指针。该函数将术语数存储在 *pnterms 中。该函数从文件名中读取所有术语,并将它们放在 *terms.
指向的块中--
我附上了我认为这意味着什么的示意图。本质上,在堆中,我们为结构项的“数组”分配 space。并按如下方式访问:
int main(void) {
int terms = 2;
int *pnterms = &terms;
struct term *term_list = (struct term *)malloc(sizeof(struct term) * (*pnterms));
(term_list+0)->data = 1000;
strcpy((term_list+0)->word, "hello");
(term_list+1)->data = 2000;
strcpy((term_list+1)->word, "bye");
printf("%s \n", (term_list+1)->word);
}
这样对吗?
给出的描述基本上是正确的。 C 按值传递参数,而被调用函数必须修改的调用方作用域中的变量必须“按引用”传递。由于 C 中没有“引用”类型,这意味着将指针传递给变量。
以下是改写为使用 read_in_terms
的相同代码。
#include <malloc.h>
#include <string.h>
#include <stdio.h>
struct term {
int data;
char word[200];
};
void read_in_terms(struct term **terms, int *pnterms)
{
*pnterms = 2;
*terms = malloc(sizeof(struct term) * (*pnterms));
(*terms)[0].data = 1000;
strcpy((*terms)[0].word, "hello");
(*terms)[1].data = 2000;
strcpy((*terms)[1].word, "bye");
}
int main(void) {
int terms;
struct term *term_list;
read_in_terms(&term_list, &terms);
for(int n = 0; n < terms; n++)
printf("term[%d] data = %d, word = %s \n", n, term_list[n].data, term_list[n].word);
}
输出:
term[0] data = 1000, word = hello
term[1] data = 2000, word = bye