형변환

jjjjrr의 이미지

안녕하세요
sprintf(query, "./bindquery %s%d",buf,clientinfo.addr);
위코드에서
clientinfo.addr 는 unsigned long int형입니다
근데여
sprintf(query, "./bindquery %s%s",buf,clientinfo.addr);
이렇게 해도 컴파일시 에러없이 통과됩니다
형이 바뀌어도 상관없는건가요
실제 프로그램이 실행되어도 이상없을까요
두가지경우를 다해도 컴파일에러가 나지않읍니다
제생각에는 에러가 나야정상일것같은데여
조언부탁드립니다
그리구
(chsr*)clientinfo.addr 이렇게 막바로 캐스팅해서 사용해도 되나요

cdpark의 이미지

printf에서 인자의 형이 template와 맞는지는 프로그래머의 책임입니다.

int를 char *로 casting하는 것도 당연히 문제가 되고요.

서지훈의 이미지

위 코드에서 문법적인 오류는 없습니다.
그러니 당연히 컴파일 시 에러가 없는것도 당연하고.
그런데... 문제는 Run-Time 시에 원하는 결과가 나오는지 입니다.
우너래 clientinfo.addr은 단순한 정수값인데...
sprintf(query, "./bindquery %s%s",buf,clientinfo.addr);
위에서 사용된건 정수 값이 아니라...
포인터의 주소 값으로 사용이 되었습니다.
그러니 clientinfo.addr 값의 주소에 있는 문자열을 찍어 내려 할 것입니다.
그러나 이건 의도하지 않은 일인거 같은데...
이런건 잘못된 결과가 나오게 되겠지요.

그리고 캐스팅에서 주의 할점은 promotion은 상관은 없지만 그 반대는 의도하지 않은 결과가 아놀 수 있음으로 되도록이면 사용하지 않는게 좋습니다.
promotion이라 하면 일반 사전적 의미로 승진을 뜻하는데...
C에서 상위 캐스팅을 의마하게 됩니다.
char -> short -> long 이런 식으로의 캐스팅입니다.
이러한 건 더 큰 공간으로 캐스팅이 되니깐 값에 변화가 없지만....
역순은 저장 공간이 줄어들기 때문에 값의 변동이 올 수가 있는 것입니다.
자신의 등치보다 작은 옷을 억지로 입을려 하면 찢어지는 정도의 효과라고나 할까나?

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

lsj0713의 이미지

가변 인자 함수에 대해 알고 계셨다면 무엇이 잘못되었는지 단박에 아실 수 있을 겁니다. 가변 인자 함수에서, 함수 본체 쪽에서는 인자로 넘어오는 변수의 갯수와 타입에 대해 전혀 알지 못합니다. 따라서 별도의 방법으로 따로 넘어오는 인자의 갯수와 타입을 알려 주어야 합니다. printf류의 함수에서는 포맷 문자열이란 방법을 이용해서 그것을 알려주고 있지요.

sprintf(query, "./bindquery %s%d",buf,clientinfo.addr);

만약 포맷 문자열과 그 뒤에 넘어오는 가변 인자들의 갯수와 타입이 일치하지 않을때는, 심각한 문제가 일어날 수 있습니다(반대로 아무일없이 무사히 넘어갈 수도 있습니다). printf류의 함수는 포맷 문자열에 의존해서 같이 넘어오는 변수들을 읽어들입니다. 만약 int형 변수를 읽어들여야 될 때에 double형 변수를 읽어들인다면, 어떠한 일이 벌어질 지 전혀 장담할 수 없습니다. (컴파일러에 따라 다른 동작을 보일 수 있으며, 정의되지 않은 행동입니다)

컴파일 에러나 런타임 에러가 발생하지 않는다고 해서 안심하진 마십시오. 오히려 그런 류의 잘 발견되지 않는 버그들이 훨씬 더 까다롭고 위험합니다. 또한 어떠한 진단메시지를 내보낼 것인가에 대해서도 C 표준에서는 거의 정의하고 있지 않습니다. (이것이 각 C언어 컴파일러마다 진단메시지와 출력방식이 전혀 다른 이유입니다) 잘못된 에러메시지를 내보낼 수도 있고, 아예 에러메시지를 출력하지 않을 수도 있습니다.

가변인자 함수에 대한 자세한 것은 아래 링크를 참고하십시오.

http://www.delorie.com/djgpp/doc/libc-2.02/libc_715.html

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.