所以,我发现了一个“差异” - 或者更可能是我对C中数组理解的差距。下面是一个简单的程序来反转字符串。该差异在代码的评论中注明。
#include <stdio.h>
#include <string.h>
void reverser(char to_bb[]){
printf("%s\n", to_bb[some_valid_number]); /* This results in a bus error */
int counter = strlen(to_bb); /* ^ Assume actual integer */
char reversed[counter];
int counter2 = 0;
for(--counter; counter >= 0; counter--){
reversed[counter2] = to_bb[counter]; /* This does not */
counter2++;
}
reversed[counter2] = '\0';
printf("The reversed: %s\n", reversed);
}
int main(){
char to_be_reversed[20];
puts("Enter the string to be reversed: ");
scanf("%19s", to_be_reversed);
reverser(to_be_reversed);
return 0;
}
为什么printf();
会导致总线错误,而调用元素将它们交换到不同的数组则不然?他们不是在说同样的事情吗?
答案 0 :(得分:7)
printf("%s\n", to_bb[some_valid_number]);
s
转换说明符需要指向char
的指针,但to_bb[some_valid_number]
的类型为char
。
要获取指向to_bb[some_valid_number]
对象的指针,您可以使用&
运算符:
printf("%s\n", &to_bb[some_valid_number]);
如果您想要打印to_bb[some_valid_number]
字符,请使用c
转换说明符:
printf("%c\n", to_bb[some_valid_number]);