2016-11-27 1 views
1

구조체를 초기화하고 반환 값으로 다시 전달하는 함수를 만들려고하는데 작동하지 못합니다. 나는 어디에서 실수 했습니까? 세그먼트 오류 오류가 발생합니다.함수의 반환 값에 의한 C struct 초기화

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

typedef struct { 
    int id; 
    char *name; 
} Object; 

Object object_ctor(int id, char *name); 

int main() 
{ 
    Object x; 

    x = object_ctor(1, "Alex"); 

    printf("%s\n", x.name); 
    return 0; 
} 

Object object_ctor(int id, char *name) 
{ 
    Object y; 
    y.id = id; 
    y.name = *name; 

    return y; 
} 
+0

Y는 스택에 로컬입니다. 함수가 종료 될 때 사라집니다. 힙 사용 필요 – OldProgrammer

+0

'object_ctor'라는 이름을 참조 해제합니다. 그러지 마. 'strdup (name)'이나 그와 비슷한 것을 쓰고 싶을지라도 다른 함수에서'object_ctor'를 호출하면 포인터가 할당 된 문자열을 가리킬 수 있기 때문에 힙 할당 버전의 문자열을 가질 수 있습니다 스택 (즉, 더 이상 존재하지 않음). – Goodies

+3

@OldProgrammer : 구조체와 같은 지역 변수 (복사본)를 반환하는 것은 전적으로 허용됩니다. 허용되지 않는 것은 로컬 변수에 포인터를 반환하는 것입니다. 함수가'Object *'를 반환하면, 당신의 관심사는 합법적 일 것이다. –

답변

2

는 어디에서 실수를 않았다

?

y.name = *name; 

그것은 이유 중 몇 가지에 대한 잘못된 :

라인입니다.

  1. 당신은 유형 char*, y.name의 변수로하는 char, *name을 할당한다. 포인터에 대한 대입 연산자의 제약을 위반합니다. C11 표준에서

    :

    6.5.16.1 간단한 할당

    제약 다음의

    하나 하나는 개최한다 :

    ...

    - 왼쪽 피연산자는 원 자형, 규정 형 또는 비 한정형 포인터 유형을 가지며 (왼쪽 피연산자가 왼쪽 값 변환 이후에 가질 유형을 고려하여) 두 피연산자는 모두 호환 가능 유형의 정규화되거나 비 한정 버전에 대한 포인터이며 왼쪽 피연산자가 가리키는 유형 오른쪽에서 가리키는 유형의 모든 한정어가 있습니다.

    - 왼쪽 피연산자에는 원자 적, 규정 된 또는 정규화되지 않은 포인터 유형이 있으며 (왼쪽 값 피연산자가 왼쪽 값 변환 후 가질 유형을 고려하여) 하나의 피연산자는 객체 유형에 대한 포인터이고 다른 하나는 정규화 또는 정규화되지 않은 버전 void이고, 왼쪽에 의해 지적 된 유형은 오른쪽으로 지시 된 유형의 모든 규정자를가집니다.

    - 왼쪽 피연산자는 원자, 한정어 또는 규정되지 않은 포인터이고 오른쪽은 널 포인터 상수입니다. 또는

    해당 할당의 RHS가 위의 제약 조건 중 하나를 만족하지 못합니다. 당신이

    printf("%s\n", x.name); 
    

    에 널 종료 문자열로 그 값을 취급 할 때

  2. 당신은 정의되지 않은 동작으로 실행합니다.

컴파일러에서 경고 수준을 높이면이 오류를 감지 할 수 있습니다. gcc -Wall으로 컴파일 할 때 다음과 같은 결과가 나옵니다.strdup이 플랫폼에서 사용할 수없는 경우

y.name = strdup(name); 

, 그것을 구현하기 너무 어렵지 않다 :

soc.c: In function ‘object_ctor’: 
soc.c:26:12: warning: assignment makes pointer from integer without a cast [-Wint-conversion] 
    y.name = *name; 
      ^

당신은 같은 것을 사용합니다. 웹에서도 쉽게 구현을 찾을 수 있습니다.

+0

'strdup()'은 일반적으로'malloc()'을 사용한다는 것을 의미합니다. 아마도'object_dtor' 함수는'strdup()'에서 할당 한 메모리를 free() 할 수 있습니다. – Goodies

+0

고맙습니다, 저를 위해서 일합니다 :) – Zeusko

+0

나는 또한 이것을 시도했습니다 : y.name = name; 어떻게 작동 했습니까? – Zeusko

관련 문제