如何访问作为char数组的指针值

时间:2017-07-09 02:34:58

标签: c pointers char

我有一个函数可以将长度为64的char保存到指针中,但我不确定如何在程序中稍后将char转换为输出。

所以我的问题是如何从指针访问整个char []?

char intToAscii(unsigned long x, char* output){
    int i;
    unsigned long n;
    char str[64];
    for(i =0; i<64;i++){
        n=x>>63;
        if(n==0){
            str[i]='0';
        }
        else{
            str[i]='1';
        }
        x=x<<1; 

    }
    str[64]='\0';

    printf("Value of x is %s \n",str);  
    *output = str;  
}

1 个答案:

答案 0 :(得分:4)

您不能使用指向定义该数组的作用域之外的本地数组的指针,因为它存储在函数的堆栈框架中,并在函数完成并返回时弹出,所以它不再有效使用它(读它)。相反,您可以从调用函数传递数组。

// In the caller function
char data[64];
intToAscii(1234, data);

intToAscii()功能,只需

void intToAscii(unsigned long x, char *str)
{
    int i;
    unsigned long n;
    for (i = 0; i < 63; i++) {
        n = x >> 63;
        if (n == 0) {
            str[i] = '0';
        } else {
            str[i] = '1';
        }
        x = x << 1; 
    }
    str[i] = '\0';    
    printf("Value of x is %s \n", str);  
}

另一个错误,就是你正在访问str的索引64,但是数组是 0 -indexed所以64超出界限,'\0'终止符必须是在最后一个字符之后,您可以通过使用索引i来实现这一点,索引void intToAscii(unsigned long x, char *str, size_t size) { int i; unsigned long n; for (i = 0; i < size - 1; i++) { n = x >> 63; if (n == 0) { str[i] = '0'; } else { str[i] = '1'; } x = x << 1; } str[i] = '\0'; printf("Value of x is %s \n", str); } 在循环结束时具有正确的值,这样如果它不是63或者它并不重要64,只要循环在数组的最后一个元素之前结束,它就是正确的值。

还有一件事,像这样的函数是非常危险的,相反,你可以传递另一个参数来告诉函数目标数组中有多少字节可用,如下所示,

char

最后,正如@ David C. Rankin所评论的那样,你的函数会返回IndexOf,但它的正文不会返回任何地方,这将导致未定义的行为。你不需要你的函数来返回任何东西,因为它会修改数组。