以下是我所做的简化解码函数,它应该采用特定大小的字符串,并返回字符串,每个字符的ascii值比原始字符串中相同位置的原始字符少一个。
例如,如果我使用参数" BCDEF" 5,那么我应该能够拥有" ABCDE"但是,我回来的主要是垃圾。
char* dec(char* s,int sz){
int x=0;
unsigned char p=0;
char ss[sz];
if (s){
for (x=0;x<sz;x++){
p=s[x];
p=p-1;
ss[x]=p;
}
return ss;
}
else{return s;}
}
以下是我从外面打电话的方式:
char *item="BCDEF",*item2=" ";
item2=dec(item,5);
printf("item= %s",item2);
将item2的结果打印为字符串会产生垃圾,即使我尝试保留固定大小。
编译代码也会产生&#34;警告:函数dec返回局部变量的地址&#34;但我并没有在变量前加上&amp;。
我将如何解决这个问题?
答案 0 :(得分:3)
ss
是dec
函数中的Local(数组)变量。当函数结束时,数组不再存在,当您稍后访问该指针/地址时Undefined behavior。
而不是将本地数组放在堆栈上,malloc
它:
char *ss = malloc(sizeof(char)*(sz+1)); //+1 for NUL char
//do something
return ss;
当您不需要时,使用free
清除内存。
答案 1 :(得分:0)
试试这个:
#include <stdio.h>
#include <stdlib.h>
void dec(char *s, int sz, char *ret)
{
if ( s == NULL )
{
printf ( "\n entered string have NULL value\n " );
exit ( 0 );
}
while ( *s != NULL )
{
*ret = (int)*s - 1 ;
s++;
ret++;
}
*ret = '\0';
}
int main ( void )
{
char * ret = NULL;
ret = (char * ) malloc (5 * sizeof (char ));
dec ("code" , 5, ret );
printf ( "\n %s\n", ret );
free ( ret );
return ( 0 );
}