2014-03-02 4 views
0

문자열에 문자를 추가하는 함수를 만들고 다음 오류 메시지 함수가 로컬 변수의 주소를 반환합니다. 아래 코드를 참조하십시오.함수가 로컬 변수의 주소를 반환합니다.

int main(int argc, char** argv) 
{ 
    char* string; 
    string ="hola mundo"; 
    char c ='x'; 

    string = cadena_mas_caracter(string,c); 
    printf("texto sumado %s",string); 

    return (EXIT_SUCCESS); 
} 

char *cadena_mas_caracter(char* cadena, char caracter) 
{ 
    int i=0; 
    int largo_texto = strlen(cadena)+1; 
    char cadena_nueva[largo_texto+1]; 


    for(i=0; i < largo_texto; i++) 
    { 
     cadena_nueva[i] = cadena[i]; 
     if(cadena[i] == '\0') 
     { 
      cadena_nueva[i]= caracter; 
     } 
    } 

    return cadena_nueva; 
} 
+0

동적 기능에 스택 메모리를 할당하고 같이이, 작동하지 않습니다이 함수를 종료하자마자 메모리가 해제 될 것이므로 new/malloc을 통해 힙 메모리를 할당 한 다음 수동으로 delete/free를 통해 힙 메모리를 할당해야합니다. –

+0

char cadena_nueva [largo_texto + 1]; 이것은 로컬 변수이며 함수 내의 로컬 변수의 범위입니다. 그래서 당신은 address.yes를 반환 할 수 없습니다. 때때로 다른 작업에 할당되지 않은 메모리가 올바른 것이라면 정확한 결과를 줄 수 있습니다. –

+0

예 메서드가 끝나고 스택에서 값을 가져와야 할 때 localible 변수가 detroy라는 것을 알았지 만 그 이유는 무엇입니까? 나는 노력하고있다. 그러나 나는 그것을 이해하지 못했다. 누군가 올바른 형식을보기 위해 코드를 작성할 수있다. – Premier

답변

4

(예, 가끔 예상되는 결과를 반환 할 수 있습니다!) 스택에서 할당 된 함수에서 지역 변수 포인터를 반환해야합니다!

여기에 이유에 대한 훌륭한 설명 : 당신이 완료되면 Can a local variable's memory be accessed outside its scope?

당신의 코드가 작동하려면이

char* cadena_nueva = (char*)malloc(sizeof(char)*(largo_texto+1)); 

char cadena_nueva[largo_texto+1]; 

free()을하는 것을 잊지 마세요 교체 그것을 사용하여


당신이 힙 & 스택 메모리 저장에 대해 읽어 줄 경우 그것은 정말 당신을 도울 것입니다 :

What and where are the stack and heap? http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html http://www-ee.eng.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.8.html

+0

해야합니다 ->해야합니다. 그것은 어쨌든 중복입니다 -이 격일로 요청됩니다. – dasblinkenlight

+0

그래 .. 나는 같은 링크를 언급했다 :) 때로는 예상 답변을 반환 할 수 있다고해서는 안된다고했다. – brokenfoot

+0

괜찮 았지만 내 코드 여야합니다. – Premier

관련 문제