我不确定为什么malloc会分配这么多空间。这是问题代码的片段:
char * hamming_string = NULL;
void enter_params(){
printf("Enter the max length: ");
scanf_s("%d", &max_length);
hamming_string = (char *) malloc(max_length * sizeof(char));
// to test what's going on with the hamming string
for(int i = 0; i < strlen(hamming_string); i++){
hamming_string[i] = 'a';
}
printf("hamming string = %s", hamming_string);
}
我将max_length设置为2,并且我看到了12 a。在另一个函数中,我将让用户使用scanf_s输入汉明字符串(&#34;%s&#34;,&amp; hamming_string);但我一直违反访问权限
答案 0 :(得分:2)
hamming_string
不是字符串,直到其中一个元素为'\0'
。
str *()函数只能用于字符串。
您的程序调用未定义的行为(通过使用非字符串的内容调用strlen()
)。
答案 1 :(得分:1)
您要求未初始化变量的strlen
(这是未定义的行为):
strlen(hamming_string);
(m)再分配一个以存储追踪\0
:
hamming_string = malloc(max_length + 1);
更改为
for(int i = 0; i < max_length; i++){
hamming_string[i] = 'a';
}
并且不要忘记在for循环后添加跟踪\0
:
hamming_string[i] = '\0'; /* or use calloc and skip this line */
答案 2 :(得分:1)
malloc()分配您要求的空间量,但不会初始化它。当你调用strlen()时,它会从hamming_string指向的内容开始扫描内存并继续,直到它找到一个null或者它会访问它不应该的内存并导致异常。
此外,您需要在字符串末尾为null分配空间,如果您希望字符串包含2个字符,则需要分配3个字符以允许终止null。
答案 3 :(得分:0)
void check_code(){
int actual_length, parity_bit, error_bit = 0, c = 0, i, j, k;
printf("Enter the Hamming code: ");
scanf_s("%s", &hamming_string);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
此scanf_s()
来电不正确。
根据C11 documentation或MSDN documentation,它需要
scanf_s("%s", hamming_string, size - 1);
请注意,您在功能中不了解size
请注意,您未通过hamming_string
的地址; hamming_string
本身会转换为第一个元素的地址。
答案 4 :(得分:0)
<强>例1:强>
char *hamming_string = malloc((max_length + 1) * sizeof(char));
for (i = 0; i < max_length; i++)
{
hamming_string[i] = 'a';
}
hamming_string[i] = '\0';
printf("hamming string = [%s]\n", hamming_string);
<强>输出:强>
sdlcb@Goofy-Gen:~/AMD$ ./a.out
hamming string = [aaaaaaaaaaaa]
<强>例2:强>
char s;
for (i = 0; i < max_length; i++)
{
scanf(" %c", &s);
hamming_string[i] = s;
}
hamming_string[i] = '\0';
printf("hamming string = [%s]\n", hamming_string);
<强>输出:强>
sdlcb@Goofy-Gen:~/AMD$ ./a.out
a
b
c
d
e
f
g
h
i
j
k
l
hamming string = [abcdefghijkl]