由函数修改的字符指针将无法正确显示更新字符串值

标签 c pointers

我在 main 中有一个名为 sq 的 char 指针,并且将指向 sq 的指针转换为函数 inttocharp,该函数将给定的整数转换为字符串,其中所有十进制数字都以相反的顺序排列。该字符串首先存储在临时字符数组中。然后,我尝试通过将强制转换指针指向的值分配为等于first 来修改sq 的值。当我使用命令 printf("%s\n", *outz); 时在打印指向的指针的更新字符串值的函数中,它可以正常工作,但是如果我在函数完成运行后尝试使用 sq 执行相同的命令,我只会得到无意义的符号。如果我将 *outz = first 替换为 *outz = "aw",则 sq 的 printf 命令将打印出预期值“aw”。问题是什么以及如何解决?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void inttocharp(int numin, char** outz);

int main(void) {
   char* sq;
   inttocharp(13719, &sq);
   printf("%s \n", sq);
   return(0);
}

void inttocharp(int numin, char** outz) {
     char first[33] = "";

     char temp;
     int currnum;
     int divisval = 10;
     do {
        printf("%d \n", numin);
        printf("%d \n", divisval);
        currnum = numin%divisval;
        printf("%d \n", currnum);
        numin -= currnum;
        currnum *= 10;
        currnum /= divisval;
        printf("%d \n\n", currnum);
        temp = 0x30 + currnum;
        strncat(first,&temp,1);
        divisval *= 10;
     } while(numin != 0);
     *outz = first;
     printf("%s \n", *outz);
}

最佳答案

我不太清楚您希望在这里实现什么,
无论如何,您获得垃圾值的原因是字符数组 char first[30]="" 对其函数 inttocarp(int numin, char** outz) 是本地的code> 因此仅在执行该函数期间才存在。
因此 printf("%s\n", *outz) 在函数内工作正常
但是,一旦函数结束,first[30] 的范围就结束了,并且它不存在,因此 outs 指向某个包含垃圾值和 的内存位置因此,您在 main()
中得到 sq 的垃圾值 但是当你将一个常量指向*outz时,它的作用域是程序的末尾,所以即使在main()中,你也会得到它的存在包含该常量
的内存位置 使 first[30] 的减速全局化将解决您的问题..

关于由函数修改的字符指针将无法正确显示更新字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40456944/

相关文章:

c - Arduino闹钟没有rtc项目错误

c++ - 为什么根值没有更新

检查 typedef 定义的函数指针是否为空

c++ - 指针在字符串C++中的输出位置

c - 什么是左值和右值表达式?

c++ - 奇怪的行为 printf( ) 每行调用 10-13 次

c - 在C中的双向链表中插入

c - 后增量运算符 : Unexpected Behavior

使用链表的 C++ 堆栈

c++ - 我可以更改将引用参数传递到指针的函数的输入并仍然使其工作(C、C++)吗?