gpt4 book ai didi

c - c 共享库中的数组

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:20 26 4
gpt4 key购买 nike

我基本上想在动态库的方法中处理结构数组,但是当我传递数组并打印它时(以与在我的主程序中完全相同的方式)它有不同的值。

考虑这样一个结构:

struct color {
uint8_t b;
uint8_t g;
uint8_t r;
uint8_t a;
}

打印它的代码如下所示:

printf("pos: %p\n", array);
for (i = 0; i < size; i++) {
printf("bgra: %08x\n", ((uint32_t *) array)[i]);
}

现在,我在测试程序中做的是这样的:

printf("Table:\n");
print(table, size);

输出看起来像这样(异常(exception)情况):

pos: 0x7fff5b359530
bgra: 00000000
bgra: ff0000ff
bgra: ff00ffff

但是当我在库中的函数中执行相同的代码时,这就是我得到的:

pos: 0x7fff5b359530
bgra: 00000008
bgra: 00000030
bgra: 5b3598e0

现在我想知道我做错了什么,因为我看不到我的代码中的错误。此外,这些值必须以某种方式相关,因为输出总是相同的(当然除了地址)。

标题.h

#include <stdint.h>

#ifndef __HEADER_H_
#define __HEADER_H_

struct bmpt_color_bgra {
uint8_t b;
uint8_t g;
uint8_t r;
uint8_t a;
};

void print(struct bmpt_color_bgra *table, uint8_t size);
uint8_t *gen(struct bmpt_color_bgra *table, uint8_t size);
#endif

库.c

#include <stdlib.h>
#include <stdio.h>
#include "header.h"

#define EXPORT __attribute__((visibility("default")))

__attribute__((constructor))
static void initializer(void) {
printf("[%s] initializer()\n", __FILE__);
}

__attribute__((destructor))
static void finalizer(void) {
printf("[%s] finalizer()\n", __FILE__);
}

EXPORT
void print(struct bmpt_color_bgra *table, uint8_t size) {
uint8_t i;

printf("pos: %p\n", table);
for (i = 0; i < size; i++) {
printf("bgra: %08x\n", ((uint32_t *) table)[i]);
}
}

EXPORT
uint8_t *gen(struct bmpt_color_bgra *table, uint8_t size) {
printf("table in func:\n");
print(table, size);
}

测试.c

#include <stdio.h>
#include <stdlib.h>
#include "header.h"

int main(int argc, char **argv) {
struct bmpt_color_bgra arr[3];
struct bmpt_color_bgra c;

c.b = 0x0;
c.g = 0x0;
c.r = 0x0;
c.a = 0x0;
arr[0] = c;

c.b = 0xff;
c.a = 0xff;
arr[1] = c;

c.r = 0xff;
arr[2] = c;

//the first result (the correct one)
print(arr, 3);

//the second result
gen(arr, 3);
}

最佳答案

这可能归结为结构内成员的内存对齐,以及程序和动态/共享库之间结构本身的大小不同。您没有提及您使用的是哪个编译器,但是为您的程序和共享库使用不同的编译器或编译器选项可能会导致这种效果。

您可以通过准确指定结构成员的对齐方式来保持模块之间的二进制兼容性。例如,在 GCC 中,您可以通过使用属性强制结构在内存中的表示方式。

参见 https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Type-Attributes.html GCC对齐指令

struct bmpt_color_bgra {
uint8_t b;
uint8_t g;
uint8_t r;
uint8_t a;
} __attribute__ ((packed));

另请查看 Byte Alignment for integer (or other) types in a uint8_t array对于类似的问题。

关于c - c 共享库中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37726441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com