2013-03-20 1 views
0

안녕하세요. C님께 서 모든 nitygrity 것들을 이해하기 위해 열심히 연습하고 있습니다. 구조를 시도하는 동안 값과 참조로 함수에 구조를 전달하려고하는 코드 조각을 작성합니다. 하지만 다음값으로 호출하고 참조로 호출하여 구조화하려고하면 오류없이 코드가 컴파일되지만 쓰레기 값이 인쇄됩니까?

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

struct foo{ 
     char arr[200]; 

     int x_val; 
     int y_val; 

     float result; 

     }; 

struct foo my_foo; 

int foo_fun(struct foo var);  //proto declearation 

int foo_fun1(struct foo *var1); //proto declearation 

int main() 
{ 
    //As I was not getting prover string printed by using function foo_fun1 
    // I have tried to print directrly calling another ptr here 

    int i = 0; 

    struct foo *ptr; 

    ptr = (struct foo *)malloc(sizeof(struct foo)*10); 

    ptr->arr[0] = "calculator"; 

    printf("Ptr zero contains a string %s\n",ptr->arr[0]); //even here prints wrong value 


    i = foo_fun(my_foo); 

    printf("Result from foo_fun is %d\n",i); 

    //Expecting this function to print string ....but getting some unexpected result 

    foo_fun1(&my_foo); 

    system("pause"); 

    return 0; 

} 

// pass by value 

int foo_fun(struct foo var) 
{ 
    int i; 
    int total = 0; 


for(i=0;i<sizeof(var.arr); i++) 

      { var.arr[i] = i; 

       total = total+var.arr[i]; 
      } 
    var.x_val = 230; 
    var.y_val = 120; 

    return total; 

    } 

// pass by reference 

int foo_fun1(struct foo *var1) 
{ 
    int i = 0; 

    var1 = (struct foo *)malloc(sizeof(struct foo)*20); 

    var1->arr[0] = "A"; 

    printf("%s\n",var1->arr); 

    return 0; 


    } 
+2

@NPE 경고가 오류로 취급되지 않고 그냥 무시되는 이유는 무엇입니까? –

+0

질문 할 때 코드 형식을 지정할 때 최소한의 노력을하십시오. – Lundin

답변

4

뭔가 잘못 ... 너희들이 구조에 깊이 튜토리얼에서 적절한에 나를 인도 할 수 있다면 그것은 큰 도움이 될 것입니다 ... 친구를 도와주세요 감사를하고있는 중이 야 생각 잘못 : (BTW, 컴파일러는이에 대해 경고해야합니다.)

ptr->arr[0] = "calculator"; 

대신 strcpy()를 사용해야합니다

.

비슷한 구조를 사용하는 다른 장소에서도 마찬가지입니다.

마지막으로 malloc() (foo_fun1())은 불필요합니다. 함수 인수의 값을 겹쳐 쓰는 것뿐만 아니라 (왜?), 메모리 누수도 발생합니다.

+1

하지만 그게 유일한 문제는 아닙니다. 더 많은 것이있다 :'var1 = (struct foo *) malloc (sizeof (struct foo) * 20);'매개 변수는 휴지통이고 메모리는 유출된다. –

+0

@AlexeyFrunze : 좋은 지적, 감사합니다! – NPE

+0

고맙습니다. NPE ... 당신의 노력에 감사드립니다. – studyembedded

1

라인

ptr->arr[0] = "calculator"; 

잘못, 당신은 그 ptr->arr[0]가 나타내는 무엇을, 하나의 문자에 문자열을 할당 할 수 없습니다. 당신이 그런 식으로 문자 배열에 문자열을 assing 수 없기 때문에

ptr->arr = "calculator"; 

가 너무 잘못된 것입니다, 당신은 strcpy()을 사용해야합니다. 단일 문자를 코드에서

+0

감사합니다. 실수를 저질렀습니다 ... 고마워요. – studyembedded

1

세 가지 문제 배열을하지 인쇄 때문에



printf("Ptr zero contains a string %s\n",ptr->arr[0]); 

printf("Ptr zero contains a string %s\n",ptr->arr); 

해야한다 :

을 당신은하지 않아야 캐스트 반환 값 : malloc() -

당신은 인덱스 배열에 문자열 상수를 할당하려고하는 - 그래서

strcpy(ptr->arr, "calculator");하고 또한

strcpy(var1->arr,"A");해야한다 - 코드에서 대규모 메모리 누수가있다. 어디서나 free()으로 전화하지 마세요.

관련 문제