We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
cc array test 01
函数cc_array_set的原型中最后一个参数是void *用于传递任意数据类型指针,在实际创建内存的时候,使用了memcpy将立即数所指向的内存复制到新内存中,配套如下测试代码是好理解的:
cc_array_set
void *
memcpy
for (i = 0.27; i < 10; i++) assert(!cc_array_set(&array, i, &i));
但是在阅读cc list map test 01代码时,有了些许困惑:
cc list map test 01
assert(!cc_list_map_set(map, (void *)1, (void *)'a', NULL)); assert(!cc_map_set(map, (void *)2, (void *)'b', NULL)); assert(!cc_map_set(map, (void *)9, (void *)'c', NULL));
根据cc_list_map_set的实现可知,是将void *key直接赋值为了(void *)1,即将0x00000001视为一个地址并视为键值进行了存储,(void *)'a'则是将字符串常量首地址存入void *value,这个字符串常量在跳出函数体后是不是会被系统回收而导致错误?c99似乎是有语法糖可以对立即数进行取址的,再内部创建新的内存,并使用memcpy是不是更为稳妥?
cc_list_map_set
void *key
(void *)1
0x00000001
(void *)'a'
void *value
c99
The text was updated successfully, but these errors were encountered:
@andy27182 我觉得换一个思路会更顺畅,void* 不要理解成指针,理解成 “任意机器字长的值” 比较好。这里的 (void*)1 只是为了表示 1 这个值,强转是为了应付编译器。同理 (void*)'b' 也只是为了使用 'b' 这个值。并不涉及到指针。
Sorry, something went wrong.
No branches or pull requests
cc array test 01
函数
cc_array_set
的原型中最后一个参数是void *
用于传递任意数据类型指针,在实际创建内存的时候,使用了memcpy
将立即数所指向的内存复制到新内存中,配套如下测试代码是好理解的:但是在阅读
cc list map test 01
代码时,有了些许困惑:根据
cc_list_map_set
的实现可知,是将void *key
直接赋值为了(void *)1
,即将0x00000001
视为一个地址并视为键值进行了存储,(void *)'a'
则是将字符串常量首地址存入void *value
,这个字符串常量在跳出函数体后是不是会被系统回收而导致错误?c99
似乎是有语法糖可以对立即数进行取址的,再内部创建新的内存,并使用memcpy
是不是更为稳妥?The text was updated successfully, but these errors were encountered: