【问题标题】:Arguments changing value in C在 C 中改变值的参数
【发布时间】:2013-03-03 03:33:57
【问题描述】:

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

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

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

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

它输出我调用scene->shader->start的内存地址,然后在所述函数内输出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*。

【问题讨论】:

  • 你能展示一些函数签名和变量声明吗?
  • 是的,一秒钟。我将编辑我的帖子。
  • scene->shader->dataStart 声明在栈上吗?
  • 如果要打印指针,使用%p 比使用%d 和强制转换要好。
  • 我刚刚发现在设置场景->着色器->开始和场景->着色器->结束的函数中,我混淆了这两个函数,这导致了错误。感谢大家尽自己所能提供帮助。

标签: c parameters arguments


【解决方案1】:

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

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

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

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

printf ("%p\n", (void *)ptr);

【讨论】:

  • 我本来是用_data的,后来改成别的名字了(blurp,肯定没用过,哈哈),“blurp”,也出现了同样的情况。
  • @Erkling 你在scene->shader->start( scene->shader->dataStart ); 的行之前做了printf("%p\n", scene->shader->dataStart); right 吗?
  • 是的,我将其更改为在函数调用之前检查以确保。
  • 我 +1 是因为您提供了一些有价值的信息,但由于函数签名混淆,问题已解决。
猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多