我有一个函数可以将长度为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;
}
答案 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
,但它的正文不会返回任何地方,这将导致未定义的行为。你不需要你的函数来返回任何东西,因为它会修改数组。