strcpy 관련 질문입니다.

x2nine의 이미지

안녕하세요!
C로 간단한 test를 진행중인데 벽에 가로 막혀 이렇게 글을 올립니다.

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

int sub();

int main()
{
char line[80];
strcpy(line,sub());
printf("%s\n",line());
}

int sub()
{
char line[80]={"text"};
return(line);
}

이렇게 하면 오류가 납니다.
strcpy에서 main의 line에 sub에서 온 주소값에 있는 문자를 하나씩 복사하는 것이 아닌가요?
고수님들 한 수 가르쳐 주세요!

withlhw의 이미지

보아하니... 의도하는 바는 짐작이 가는데..

왜 함수를 그렇게 만드셨는지요?

sub의 return type은 int 입니다.

char *가 되어야 하지 않을까요?

x2nine의 이미지

반환값을 보던중.. int sub가 보였습니다.
char *로 했더니 됩니다. ^^;;
자답할려고 했더니 벌써 답글이.. 정말 빠르시군요!
답변 감사합니다.
앞으로 문자 관련 test가 많이 있을텐데 앞으로도 제 벽을 허물어 주시면 감사하겠습니다. ^^

PS : return 에 대한 경고가 나왔는데.. 이건 무엇인가요?
warning: function returns address of local variable
로컬변수주소값을 반환햇다는건가요?
다른 프로그램에서 해당 메모리 영역을 사용한다면 다른 값이 올 수가 있다고 생각하는데 맞나요?

No pain! No Gain!
It's tricky~

pynoos의 이미지

x2nine wrote:
반환값을 보던중.. int sub가 보였습니다.
char *로 했더니 됩니다. ^^;;
자답할려고 했더니 벌써 답글이.. 정말 빠르시군요!
답변 감사합니다.
앞으로 문자 관련 test가 많이 있을텐데 앞으로도 제 벽을 허물어 주시면 감사하겠습니다. ^^

PS : return 에 대한 경고가 나왔는데.. 이건 무엇인가요?
warning: function returns address of local variable
로컬변수주소값을 반환햇다는건가요?
다른 프로그램에서 해당 메모리 영역을 사용한다면 다른 값이 올 수가 있다고 생각하는데 맞나요?

저 경고는 반드시 해결해 줘야합니다. 받아 쓰는 쪽에서는 이미 무효화된 영역을 접근하기 때문에 동작을 보장받을 수 없습니다.

쉽게 해결하려면 static 으로 만들어 두시고 return하시면 되죠

x2nine의 이미지

답변 감사합니다.
경고도 해결 했습니다.

char* sub(char* sub)로 해서 해결 햇습니다.

고수님들 덕에 한 수 배웠습니다. ^^

No pain! No Gain!
It's tricky~

ktd2004의 이미지

char* sub() 
{ 
    char line[80]={"text"}; 
    return(line); 
}

위함수에서 line변수는 sub 함수 내부에서만(스택) 존재합니다.
따라서 sub함수를 빠져 나오면 그 값이 어떻게 변경될지는 확신할 수 없습니다.

만약 고쳐서 쓴다면

char * sub()
{
    static char line[80] = {"text"};
    return line;
}

와 같이 사용할 수 있습니다.
이렇게 되면 line변수는 sub 함수내부에(스택) 존재하는 것이 아니라 전역공간에 존재하게 되므로 sub함수가 반환된 뒤에도 계속 사용할 수가 있습니다.

그리고 sub 함수의 반환값은 외부에서 sub함수의 내부 변수를 수정하지 않는다면

const char * sub()

로 하는게 더 낫겠지요..[/code]
ulra의 이미지

안녕하세요.
valgrind로 메모리 에러를 분석하던 도중에
일부러 strcpy에서 src와 dest 주소가 같게 해놓은 부분이 있더군요.
제가 보기에는 메모리 상에 아무 문제 없을 것 같습니다.
그런데 valgrind는 메모리 에러 체크시 이부분을 문제라고 지적
하네요.
제가 잘 몰라서 그러는데요.
strcpy에서 src와 dest 주소를 같게 해 놓을 경우 메모리에서 어떤 문제가 발생하게 되나요?

OTL 즐!!!! (좌절 금지!!!)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.