[英]Why does C abstract away sizeof during pointer arithmetic?
我在 C 中从头开始重新创建一个数组,并实现了 append、插入等常用功能。我已经完成了大部分工作,但是当我尝试在索引 C 处运行我的“插入”ZC1C425268E68385D1AB4A5074 时(相对于 F94D1AB45074)在“for loop”output 打印访问最后一个元素期间,我开始收到段错误错误。 我只使用循环进行打印,否则我使用 memory 管理函数,如 memmove 和 strdup 和 realloc 来调整大小和移动。 我还注意到它覆盖了索引 1,而不是像我预期的 memmove 那样滑动数组。
我发现我做错了指针运算,每次都使用 sizeof 运算符,但它让我思考,为什么 C 在 malloc() 之外从我们这里抽象出来? 如果我们想用不到一个完整的单位来做算术,我们会怎么做? 我们是否会将值复制到另一个变量并在那里执行,并且会有任何这样的用例吗?
有趣的是我已经这样做了几个月,没有任何问题,事实上我可以发誓这是必要的,但也许我的想法不正确。 也许那是 malloc 或 realloc 或其他东西,或者我只是走运了。
这是我正在谈论的一些代码(运行良好):
void arr_insert(Array *arr, char *element, int index)
{
// Throw an error if the index is greater than the current count
if (index > arr->count)
{
fprintf(stderr, "Index out of range");
printf("Index out of range in arr_insert\n");
return;
}
// Resize the array if the number of elements is over capacity
if (arr->count == arr->capacity) resize_array(arr);
// Move every element after the insert index to the right one position
memmove(arr->elements + ((index + 1)), arr->elements + ( index), (arr->count - index) * sizeof(char *));
// Copy the element (hint: use `strdup()`) and add it to the array
*(arr->elements + (index)) = strdup(element);
// Increment count by 1
arr->count++;
这是我之前失败的那条线
memmove(arr->elements + (sizeof(char *) * (index + 1)), arr->elements + (sizeof(char *) * index), (arr->count - index) * sizeof(char *));
a[i]
只是*(a+i)
。)memcpy
和write
等函数的工作方式),您可以将指针转换为void *
,并且您可以将其转换回( malloc
, realloc
)。 但是像(int *)((void *)x + 1)
(其中sizeof(int) != 1
)这样的事情并不能保证做任何有用的事情,甚至不能保证行为一致。而不是这样的怪物使用一些临时变量来使代码更具可读性。
字节级别的指针算法:
char *dest = (char *)arr->elements + sizeof(char *) * (index + 1);
char *src = (char *)arr->elements + sizeof(char *) * index;
memmove(dest, src, (arr->count - index) * sizeof(char *));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.