我在uni学习C并尝试访问传递给函数的字符串(二进制数字的字符串表示),将其转换为该字符串的整数表示形式。
EG。 "011"
应该返回3
。
字符串是比特流中反向输入的前3位。
char * temp_holder = (char *)malloc(sizeof(char) * 4);
int index_of_holder = 0;
for(int i = 2; i >= 0; i--){
printf("%c", buffer[i]);
temp_holder[index_of_holder] = buffer[i];
}
printf("\n");
int decimalValue = fromBinaryToInt(&temp_holder, 3);
printf("DECIMAL_VALUE: %d\n", decimalValue);
fromBinaryToInt
功能是:
int fromBinaryToInt(char *string[], int length){
for(int i = 0; i < length; i++){
printf("%c", *string[i]);
}
int int_rep = strtol(*string, (char **)NULL, 2);
printf("REP: %d\n", int_rep);
return int_rep;
}
我得到的后续错误是:
== 21 ==错误:AddressSanitizer:地址0x7ffda9f47a08上的堆栈缓冲区溢出,地址为pc 0x000000500cdf bp 0x7ffda9f47980 sp 0x7ffda9f47978 - 读取大小为8的0x7ffda9f47a08线程T0
我认为这可能是由于空终止字符造成的,所以我在length
内for-loop
修改了fromBinaryToInt
变量(+/- 1)但是没有&改变了一切。
我还认为for循环只访问第一个元素,仅此而已 - 但我的理解是通过内存地址和块的长度发送,因此for循环应该可以访问索引。
任何帮助将不胜感激, 干杯:)
答案 0 :(得分:2)
在此代码中:
int index_of_holder = 0;
for(int i = 2; i >= 0; i--){
printf("%c", buffer[i]);
temp_holder[index_of_holder] = buffer[i];
}
index_of_holder
永远不会更改,因此所有字符都放在temp_holder[0]
中。 temp_holder
的其余部分仍未初始化。
此:
int fromBinaryToInt(char *string[], int length)
声明string
是指向char
的指针数组。确实传递了&temp_holder
,它可以被认为是指向char
的一个指针的数组的第一个元素的指针。但是,更常用的方法是声明一个指向char
int fromBinaryToInt(char *string, int length)
并传递temp_holder
,如fromBinaryToInt(temp_holder, 3)
。
原样,在这里使用它:
printf("%c", *string[i]);
这需要数组的元素i
。当i
在循环中为0时,没关系,它需要第一个元素,它存在并且是指向char
的指针,然后用*
对其进行处理并打印出来。但是,当i
为1时,它会尝试获取数组的第二个元素。该元素不存在,结果行为未定义。
如果参数仅为char *string
,那么此printf
可以是:
printf("%c", string[i]);
并且,在致电strtol
时,您只需传递string
而不是*string
:
int int_rep = strtol(string, (char **)NULL, 2);
答案 1 :(得分:0)
首先,下面一行中的错误index_of_holder
始终保持不变,请将其递增。
temp_holder[index_of_holder] = buffer[i];
其次,fromBinaryToInt()
string
只是单指针,因此您无法在下一个*string[i]);
语句中执行printf
。
这是工作代码
int fromBinaryToInt(char *string, int length){
for(int i = 0; i < length; i++){
printf("%c", string[i] ); /*since string is single pointer now you can do like before you did */
}
int int_rep = strtol(string, (char **)NULL, 2);
printf("REP: %d\n", int_rep);
return int_rep;
}
int main() {
char * temp_holder = (char *)malloc(sizeof(char) * 4);
char buffer[4] ="011";
int index_of_holder = 0;
for(int i = 2; i >= 0; i--){
printf("%c", buffer[i]);
temp_holder[index_of_holder] = buffer[i];
index_of_holder++;
}
printf("\n");
int decimalValue = fromBinaryToInt(temp_holder, 3);/* no need to pass address of temp_holder */
printf("DECIMAL_VALUE: %d\n", decimalValue);
return 0;
}