Указатель, возвращаемый методом, неправильно присваивается другому указателю, определенному в C

#c #if-statement #pointers #scope #declaration

Вопрос:

Я новичок в программировании на Си. Во время работы над простым заданием мой код потерпел крах из-за ошибки сегментации. Когда я отлаживал gdb, я обнаружил, что указатель, возвращаемый методом «манчестер», отличается от назначенного указателя, «закодированного» в main.

Мой код, как показано ниже

 #include <stdio.h>
#include <stdlib.h>

char* manchester(char* bitstring);
char* differential_manchester(char* bitstring);

int main(){
    int method;
    scanf("%in", amp;method);   //scan the method to encode
    char* bitstring = (char *) malloc(100*sizeof(char)); // assumed max length = 100
    scanf("%s", bitstring);

    char* encoded;
    if(method == 0){
        char* encoded = manchester(bitstring); // where the confusion occur
    }
    else if (method == 1){
        char* encoded = differential_manchester(bitstring);
    }
    printf("%s", encoded);
    free(encoded);
    free(bitstring);

    return 0;
}

char* manchester(char* bitstring){
    char* encoded_st = (char*) malloc(200*sizeof(char));
    int i = 0, j = 0;
    while (bitstring[i] != '' ){
        if (bitstring[i  ] == '0'){
            encoded_st[j  ] = '1';
            encoded_st[j  ] = '0';
        }
        else{
            encoded_st[j  ] = '0';
            encoded_st[j  ] = '1';
        }
    }
    encoded_st[j  ] = 0; //append null character at end
    return encoded_st;
}

char* differential_manchester(char* bitstring){
    //TODO: yet to implement
    return NULL;
} 
 

отладка gdb

 (gdb) b encode.c:14
Breakpoint 1 at 0x1222: file encode.c, line 14.
(gdb) run
Starting program: /home/ishad/Desktop/computer communication/a.out 
0
1010

Breakpoint 1, main () at encode.c:14
14      if(method == 0){
(gdb) n
15          char* encoded = manchester(bitstring);
(gdb) s
manchester (bitstring=0x7ffff7e5a2d4 <__GI___libc_malloc 116> "I211300H20530017204300") at encode.c:27
27  char* manchester(char* bitstring){
(gdb) n
28      char* encoded_st = (char*) malloc(200*sizeof(char));
(gdb) n
29      int i = 0, j = 0;
(gdb) n
30      while (bitstring[i] != '' ){
(gdb) n
31          if (bitstring[i  ] == '0'){
(gdb) n
36              encoded_st[j  ] = '0';

...

(gdb) n
30      while (bitstring[i] != '' ){
(gdb) n
40      encoded_st[j  ] = 0; //append null character at end
(gdb) n
41      return encoded_st;
(gdb) p encoded_st
$1 = 0x555555559720 "01100110"
(gdb) n
42  }
(gdb) n
main () at encode.c:20
20      printf("%s", encoded);
(gdb) p encoded
$2 = 0x7fffffffdec0 "01"
 

мой вопрос в том, почему указатель encoded_st отличается от указателя encoded.
Я попытался найти причину, используя несколько ключевых слов. Но я не нашел похожего вопроса. 🙁

Комментарии:

1. Вы бы узнали об этом сами, если бы проверили личность (местоположение в памяти) переменной encoded .

Ответ №1:

Вы повторно объявили переменную с тем же именем encoded в области действия оператора if

 char* encoded;
if(method == 0){
    char* encoded = manchester(bitstring); // where the confusion occur
}
else if (method == 1){
    char* encoded = differential_manchester(bitstring);
}
 

Таким образом, переменная encoded , объявленная во внешней области относительно оператора if, остается неинициализированной.

Удалите объявления в операторе if

 char* encoded;
if(method == 0){
    encoded = manchester(bitstring); // where the confusion occur
}
else if (method == 1){
    encoded = differential_manchester(bitstring);
}
 

Комментарии:

1. Это также может быть диагностировано -Wshadow в командной строке компилятора.