C - Malloc char数组访问冲突错误

时间:2014-10-21 08:14:57

标签: c dynamic malloc

我不确定为什么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);但我一直违反访问权限

5 个答案:

答案 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 documentationMSDN 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]