【问题标题】:Why is length of array still same after realloc? [closed]为什么重新分配后数组的长度仍然相同? [关闭]
【发布时间】:2016-11-30 22:44:38
【问题描述】:

这是我的代码的一部分:

array = (int *) malloc(5*sizeof(int)); 

它已初始化并具有一些值,我在这里跳过这一步以获得更多许可。

memmove(array, array + 1, 4*sizeof(int));
array = realloc(array, 4*sizeof(int));

我想在这里完成的是删除数组的第一个成员并将整个数组向左移动一步。仍然当我尝试使用以下方法检查数组长度时:

strlen(array);

我得到值 5。似乎 realloc 无法正常工作,因为当我还尝试打印数组的第五个元素(应该在 realloc 超出数组范围之后)时,它会打印我之前给它的值.这怎么可能?

谁能指出我在哪里犯了错误,我错过了什么?

【问题讨论】:

  • 1) 指针不是数组。 2) C 没有不同的字符串类型。 3) 你的 C 书对strlen 和 C 字符串的一般看法是什么?您通过简单的搜索发现了什么?
  • 为什么要将strlen 应用于看似ints 的数组?在这种情况下,您希望strlen 做什么?关于strlen(array) 表达式,编译器告诉你什么?

标签: c dynamic-memory-allocation realloc


【解决方案1】:

strlen 计算以 NUL 结尾的字符串的长度。幸运的是 5(在某些时候遇到零):未定义的行为。

它的大小以 字节 为单位。您的数组的大小是5*sizeof(int),所以可能是 20 或 40,具体取决于 int 的实际大小。反正不是你要找的。​​p>

没有办法知道mallocrealloc 分配的块的“长度”(除了存储它!)

(但您的realloc 操作有效)

注意:这个错误的变体是依赖sizeof(array),这是指针类型的大小,因为array 是一个指针,而不是一个数组!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    相关资源
    最近更新 更多