- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我的项目中,我遇到了 C 程序。
htmp
是一个结构指针。我们首先为它分配内存。但是我们为什么要为其元素分配内存 word
再次? id
和 next
? #define HASHREC bitewisehash
typedef struct hashrec {
char *word;
long long id;
struct hashrec *next;
} HASHREC;
/* Move-to-front hashing and hash function from Hugh Williams, http://www.seg.rmit.edu.au/code/zwh-ipl/ */
/* Simple bitwise hash function */
unsigned int bitwisehash(char *word, int tsize, unsigned int seed) {
char c;
unsigned int h;
h = seed;
for (; (c =* word) != '\0'; word++) h ^= ((h << 5) + c + (h >> 2));
return((unsigned int)((h&0x7fffffff) % tsize));
}
/* Insert string in hash table, check for duplicates which should be absent */
void hashinsert(HASHREC **ht, char *w, long long id) {
HASHREC *htmp, *hprv;
unsigned int hval = HASHFN(w, TSIZE, SEED);
for (hprv = NULL, htmp = ht[hval]; htmp != NULL && scmp(htmp->word, w) != 0; hprv = htmp, htmp = htmp->next);
if (htmp == NULL) {
htmp = (HASHREC *) malloc(sizeof(HASHREC)); # allocate memory for htmp
htmp->word = (char *) malloc(strlen(w) + 1); # why allocate memory again ?
strcpy(htmp->word, w); #
htmp->id = id; # why not allocate memory for htmp->id ?
htmp->next = NULL; # why nor allocate memory for htmp->next?
if (hprv == NULL) ht[hval] = htmp;
else hprv->next = htmp;
}
else fprintf(stderr, "Error, duplicate entry located: %s.\n",htmp->word);
return;
}
最佳答案
您需要在脑海中区分两件事(1)我要存储的东西存储在什么内存中? (2) 什么变量(指针)将地址保存到它的存储位置,以便我可以再次找到它。
首先声明两个指向 struct hashrec
的指针:
HASHREC *htmp, *hprv;
for
中的两个指针。循环声明,例如
hprv = NULL, htmp = ht[hval]
及以后
hprv = htmp, htmp = htmp->next
所以大概两个指针现在都持有一个地址并指向某个地方。
if (htmp == NULL)
, 表示
htmp
不指向地址(如果您发现感兴趣的哈希索引为空,则可能是这种情况)。
HASHREC
提供存储空间(例如
struct hashrec
)您需要分配存储空间,以便您有一 block 内存来存储您想要存储的东西。所以你分配一个 block 来保存一个结构。 (见:
Do I cast the result of malloc?)
typedef struct hashrec {
char *word;
long long id;
struct hashrec *next;
} HASHREC;
char *word;
的结构分配存储空间。 (指向 char 的指针 - 8 字节(x86 上为 4 字节)); (2) 一个
long long id;
(两者均为 8 字节)和 (3) 一个指针,用于保存下一个
HASHREC
的地址在序列中。
id
可以持有
long long
值,但是
word
呢?和
next
?它们都是指针。指针有什么作用?可以找到他们指向的东西的地址。哪里可以
word
被发现?
w
当前指向你想要的东西, 但不能保证
w
将继续保留您想要的单词,因此您将制作一个副本并将其存储为
HASHREC
的一部分.所以你看:
htmp->word = malloc(strlen(w) + 1); /* useless cast removed */
malloc
是什么意思?返回?它将地址返回到新内存块的开头,
strlen(w) + 1
字节长。由于指针保存其他东西的值作为它的值,
htmp->word
现在将地址存储到新内存块的开头作为其值。所以
htmp->word
“指向”新的内存块,您可以使用
htmp->word
作为引用该内存块的引用。
strcpy(htmp->word, w); #
htmp->id = id; # why not allocate memory for htmp->id ?
htmp->next = NULL; # why nor allocate memory for htmp->next?
strcpy(htmp->word, w);
副本
w
进入那个新的内存块。
htmp->id = id;
赋值
id
至
htmp->id
和
无需分配因为当你分配:
htmp = malloc(sizeof(HASHREC)); /* useless cast removed */
char *
分配存储空间指针,(2) 一个
long long id;
(3) 一个
struct hashrec*
指针——你已经为
long long
分配了所以
htmp->id
可以存储
id
的值在
long long
的内存中.
htmp->next = NULL; # why nor allocate memory for htmp->next?
htmp->next
重新分配? (提示:目前没有)它将指向下一个
struct hashrec
.目前初始化为
NULL
以便下次您迭代到所有
struct hashrec next
的末尾指针,当你到达
NULL
时,你就知道你已经走到了尽头.
struct hashrec next
现在可以指向你刚刚分配的这个节点。同样不需要额外分配,前一个节点
->next
指针只是指向顺序的下一个节点,不需要分配任何特定的新内存。它仅用作引用(或指向)链中下一个节点的引用。
关于c - 关于 struct 内存分配机制的一些困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49290091/
我有一个程序可以打开一个窗口并快速改变背景颜色并随机弹出矩形和椭圆形。我的代码有效,但我不知道为什么,因为我没有在我的代码中调用 repaint() 函数。当我使用我个人的 update() 函数包含
var allRapidSpells = $$('input[value^=RSW]'); 谁能告诉我这是做什么的? 最佳答案 我敢猜测您正在使用 MooTools ,一个 JavaScript 框架
我有一个抽象父类,它有多个子类。我希望 child 能够拥有一个对于该 child 的每个实例都相同的变量。我不想将构造函数传递给 child 来告诉它它的名字,因为当它可以被硬编码时,这看起来很愚蠢
我刚刚在 Git 存储库上做了一些糟糕的事情,我不知道如何解决这个问题。我什至不知道我是怎么把它弄成这样的……! 在存储库(托管在 git hub 上)上,有 3 个我感兴趣的分支:master、br
我是 GIT 的新手,在理解提交日志图时遇到问题。 我感觉每条平行线都是一个分支。虽然我的源代码只有 2 个分支。我在下面提供的提交日志图中看到 3-4 条平行线(Microsoft Team Ser
我是 WPF 的新手,ScrollViewer 让我很沮丧。要么我只是没有“得到”它,要么它是一种有限的控制。 这是我的挫折: 水平滚动错误 水平滚动条仅在列表底部可见(我必须滚动到底部才能看到) 坏
那么 $('table.selectable td.capable input:text') 比 $('table.selectable td input:text') 更好吗?换句话说,指定一个类会
我刚刚完成了计算机图形学类(class),我们必须对光线追踪器进行编程。尽管所有结果都是正确的,但我对 OpenMP 的使用感到困惑(顺便说一句,这不是类(class)的一部分)。我有这个循环(C++
与 PatternSynonyms ( explicitly bidirectional form ),pattern-to-expr 方程实际上形成了一个函数,但拼写为大写(假设您最终得到正确类型的
我是 javascript/coffeescript 新手。 有人可以解释一下为什么这个 CoffeeScript/JavaScript 会毫无延迟地快速通过吗?我对第一种情况的想法是,它是对 upd
如果我调用document.getElementsByClassName('cl'),我会得到一个 HTMLCollection。它似乎包含 Element 对象而不是 HTMLElement 对象,
这是我本月的 azure payasyougo 使用费用。 我很难理解为什么我要为标准中型应用服务付费,我认为它会包含在计算时间中?我只运行一个云服务,这对于一个没有做太多事情的云服务来说似乎有点陡峭
除了the issue I am already having之外,我还在I saw a video on it之后安装了HBase(尚未安装)之前,还安装了Zookeeper。在安装它时,我遇到了许
我正在将 XSLT 与 regexp:match exslt 函数一起使用。上述函数采用 JavaScript Regex 模式。因此,我尝试匹配一组数字 1 到 3 OR 5 到 7 OR 9 到
我想知道为什么这段代码会给出消息:SyntaxError:意外的标记其他。 var compare = function(choice1,choice2){ if(choice1===choice2)
我尝试使用复选框和 JQuery 过滤日历上的事件, $(document).ready(function () { $('.scrollable-menu :checkbox').click(f
假设我们有一个用户想要一个名为:“test/lasdhjal.txt”,无论如何。现在,如果我将其放入新的文件(输入)中;对象里面,它会认为 test/是一个文件夹,而它是名称的一部分。我能做什么呢?
问题是 stash 的更改不会留在我 stash 它们的分支中。其他分支存储将被覆盖示例: 我愿意: git checkout iss4 // made some changes gi
我是一个 java 新手,并且在 StackOverflow 错误/在类之间访问文件的能力方面遇到了一个非常令人困惑的问题。我知道根本原因可能是我进行了一些递归调用,但修复它的语法却让我无法理解。我认
public X createData(int n) { int[] values = new int[n]; Random rand = new Random(); for
我是一名优秀的程序员,十分优秀!