c/c++语言开发共享C指针混乱

我想在内存中存储一​​个字符串并稍后阅读:

$$->desc.constant->base.id = (char*)malloc(200); sprintf($$->desc.constant->base.id, "%f", $1); printf("->%sn", $$->desc.constant->base.id); //LINE A printf("->%in", $$->desc.constant); //LINE B //SOME OTHER CODE //Then, later on in a function call: printf("%i", expr->desc.constant); // LINE D printf("%s", expr->desc.constant->base.id); // LINE C 

虽然线路B和线路D显示相同的地址,但线路C中的printf失败并出现分段故障。 我错过了什么?

真的很感激任何帮助!

     printf("->%in", $$->desc.constant); //LINE B 

    那是无效的。 当你在它之前显示该行constant实际上是一个指针时,你不能将它视为int类型。 它们并不具有相同的尺寸和对齐方式。 使用用于void*的格式。 它将正确输出内存地址:

     printf("->%pn", (void*)$$->desc.constant); //LINE B 

    这是一个例子:

     /** $ gcc print_number.c -o print_number */ #include  #include  #include  int main(int argc, char *argv[]) { const char* number_format = "%.*g"; const int ndigits = 15; assert(ndigits > 0); const int maxlen = ndigits + 8 /* -0.e+001, Infinity */ + 1 /* '' */; char *str = malloc(maxlen); if (str == NULL) { fprintf(stderr, "error: mallocn"); exit(1); } double number = 12345678901234567890.123456789012345678901234567890; /** `number = 0/0` crashes the program */; printf("number: %ft", number); int len_wouldbe = snprintf(str, maxlen, number_format, ndigits, number); assert(len_wouldbe < maxlen); printf("%sn", str); return 0; } 

    输出:

     number: 12345678901234567000.000000 1.23456789012346e+19 

    也许在两段代码的时间之间,你有free的字符串?

     $$->desc.constant->base.id = (char*)malloc(200); sprintf($$->desc.constant->base.id, "%f", $1); printf("->%sn", $$->desc.constant->base.id); //LINE A printf("->%in", $$->desc.constant); //LINE B //SOME OTHER CODE // which happens to do free($$->desc.constant->base.id); printf("%i", expr->desc.constant); // LINE D printf("%s", expr->desc.constant->base.id); // crash 

    鉴于该程序正在产生分段错误,我认为问题很可能是expr->desc.constant指定(指向)的结构已被重用,因为空间已分配,或者可能空间从未真正分配给所有。

    该代码展示了各种静脉罪,例如使用sprintf()而不是snprintf() ,并且无偿地为浮点数的字符串表示分配200个字节。 (你不太可能需要那么多空间;如果你这样做,你应该最多允许至少100个数字,因为浮点数的指数范围通常为+/- 308,这是你唯一的原因需要200个字符才能允许非常大或非常小的数字。)

    您已经显示$$->desc.constant指向同一个地方,但您尚未显示该空间的分配方式。 然后在$$->desc.constant->base.id分配字符串空间,而不清楚地为base分配空间。

      以上就是c/c++开发分享C指针混乱相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/545012.html

      (0)
      上一篇 2021年1月9日
      下一篇 2021年1月9日

      精彩推荐