objective-c - 这段C/Obj-C代码让我百思不得其解

标签 objective-c c

我有这个简单的方法来移动数组中的元素。

void queuePut(uint32_t val, uint32_t *q, int qlen) {
    for (int i=qlen; i>0; i--) {
        q[i] = q[i-1];
    }
    q[0] = val;
}

在我的类头中我定义了一个结构

@interface MyClass : NSObject {
    struct {
        uint32_t cookie[10];
        uint32_t value[10];
    } queue;
}

我反复将元素放在两个队列的前面

queuePut((uint32_t)cookie, myClassInstance->queue.cookie, cookieQueueLen);
queuePut((uint32_t)intValue, myClassInstance->queue.value, valueQueueLen);

当我这样做时,我的值(value)队列布局随着时间的推移如下:

0.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
1.0.0.0.0.0.0.0.0.0.
1.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.

当我删除第一行 queuePut((uint32_t)cookie, ... 值队列显示这个(我想要它是什么):

0.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
1.0.0.0.0.0.0.0.0.0.
1.1.0.0.0.0.0.0.0.0.
0.1.1.0.0.0.0.0.0.0.
0.0.1.1.0.0.0.0.0.0.
0.0.0.1.1.0.0.0.0.0.
0.0.0.0.1.1.0.0.0.0.
0.0.0.0.0.1.1.0.0.0.

这是什么原因造成的?

问候, 埃里克

最佳答案

cookieQueueLenvalueQueueLen 到底是什么?

这是可疑的:

void queuePut(uint32_t val, uint32_t *q, int qlen) {
    for (int i=qlen; i>0; i--) {
       q[i] = q[i-1];
    }
   q[0] = val;
}

如果您为 qlen 传递 10,那么在第一次迭代中您将写入 q[10],这超出了 的范围>cookie(或value)数组。你在破坏内存。

所以在这种情况下,您正在写入 cookie 数组的末尾并写入 value 数组的开头。

关于objective-c - 这段C/Obj-C代码让我百思不得其解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3734402/

相关文章:

objective-c - Cocoa block 变量内存管理

iphone - 添加 Observer 到 BOOL 变量

c - 头文件中的结构在源文件中产生错误

ios - 更改 View Controller 后 UIMenuController 不显示

ios - 如何测量 Sprite 的跳跃强度?

ios 如何在用户单击按钮时关闭屏幕

c - 随机数问题(C)

c - 通过 libpcap 写一个类似 squid 的程序

c - 查找十进制数中最大的数字

c - C中指针数组的定义