我有一个变量'jmp_code',它被声明为char *。当我运行以下命令时
printf("char by char, the code is '%c%c%c%c'\n", *jmp_code, *(jmp_code+1), *(jmp_code+2),*(jmp_code+3));
printf("printing the string, the code is '%s'\n", jmp_code);
我得到以下结果
char by char, the code is '0,0,0, ,'
printing the string, the code is 'ö\├w≡F┴w'
我正在使用代码块。这是我正在玩的示例代码。
#include <stdio.h>
#include <string.h>
char * some_func(char * code);
char * some_func(char * code) {
char char_array[4];
strcpy(char_array, "000");
code = char_array;
return code;
}
int main ( void ) {
char * jmp_code = NULL;
jmp_code = some_func(jmp_code);
printf("char by char, the code is '%c,%c,%c,%c,'\n", *jmp_code, *(jmp_code+1), *(jmp_code+2),*(jmp_code+3));
printf("printing the string, the code is '%s'\n", jmp_code);
return 0;
}
我很困惑。任何帮助将不胜感激。
由于
答案 0 :(得分:4)
一些快速观察:
char * some_func(char * code) {
char char_array[4];
strcpy(char_array, "000");
code = char_array;
return code;
}
你无法在C中使用=
分配字符串。这会让事情变得混乱 - 你将本地分配的char_array
的指针代码分配给代码,但你没有复制内容记忆。另请注意,由于char_array
已在堆栈上(通常)分配,因此当您从该函数返回时,它会发现它会消失。您可以使用static
关键字解决这个问题,但我认为这不是最好的解决方案。你应该使用类似的东西(大警告这个例子不是很大的安全,你需要检查字符串长度,但为了简洁起见):
void some_func(char * code) {
strcpy(code, "000");
return;
}
并通过main中的some_func(jmp_code)
进行调用。如果您不确定这是做什么的,请阅读pointers。
第二个问题。
char * jmp_code = NULL;
目前,您已经声明了足够的空间来指向char类型的指针。如果您想使用上面的建议,则需要使用malloc()
和free()
,否则请声明char jmp_code[4]
,以便分配空间。
我认为发生了什么?好吧,在我的系统上,我得到了:
代码是'0,0,0 ,,'和代码 是''
但我认为jmp_code
有可能指向some_func
函数提供的堆栈上的零。我认为在您的系统上数据已被覆盖。
相反,您正在阅读终端解释为所述字符的信息。阅读字符编码。我特别建议从The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
开始答案 1 :(得分:2)
可能有趣的是看到:
const char *pos = jmp_code;
while (*pos)
printf("%d ", *pos++);
答案 2 :(得分:2)
您正在返回对临时数组的引用。当char_array
返回时some_func()
消失,但您继续使用它的地址。您需要使用malloc()
分配数组,然后在使用它之后使用free()
。
答案 3 :(得分:2)
您是从无效指针打印的。 char_array位于some_func()函数的堆栈中 该函数返回堆栈中某些东西的指针,并且在函数返回后不再有! 第一个printf发现堆栈仍然没有改变,第二个可能发现它充满了......垃圾!
答案 4 :(得分:1)
我认为 char 类型不能使用非ascii 字符代码。这意味着您的字符串包含UTF-8或类似符号,其代码可以在(0,over9000)范围内,而char代码可以在(0,255)范围内。< / p>