0

我对提供给函数更改值的参数有疑问:

scene->shader->start( scene->shader->dataStart );
printf("%d\n",(int)scene->shader->dataStart);

然后,在 scene->shader->start 里面,我打印出来:

printf("%d\n",(int) _data );

它从我调用场景->着色器->开始的位置输出内存地址,然后在所述函数内输出0。这与我通过结构内部的指针调用函数有关吗?这绝对没有意义,因为函数中的 printf() 是该函数的第一行,所以我绝对不会在任何地方将其设置为 0!非常感谢您的帮助,Erkling。

编辑:

void shader1_setdown(void *);

typedef struct {
    GLuint shaderProgram;
    void *dataStart;
    void *dataEnd;
    void (*start)(void *data);
    void (*end)(void *data);
} renderShader;

“场景”结构中有一个 renderShader*。

4

1 回答 1

2

您可能会通过使用以下划线开头的标识符来入侵实现命名空间。根据 C 语言标准,这可能导致未定义的行为。特别是_begin, _end, _data, _bss,_text被一些实现用来寻址某些内存段。

将您的标识符更改为不以下划线开头。

另一种可能性:您不能将 %d 作为 int 的地址打印出来。特别是如果您的指针类型比您的int. 这可以解释为什么您看到int. 假设指针是 64 位大端,整数是 32 位。您会看到指针的前 32 位,可能全为零,被解释为 int。

printf 地址的标准正确方法是(非 void-ptrs需要强制转换):

printf ("%p\n", (void *)ptr);
于 2013-03-14T16:46:07.010 回答