PostgreSQL C 라이브러리 libpq
을 사용 중입니다. PQgetvalue
함수로포인터에서 값을 가져올 수 있습니다.정적 문자 배열로 도우미 함수 만들기
는 지금, 나는 10 ~ 20 열이있는 테이블이 있고, 나는 간단한 printf
호출을 인쇄하려면 :
resA
resB
에이 문자열이
PGgetvalue
기능을 사용하여로드
printf("%s,%s,%s..(so on...)...%s", resA, resB, resC,..., resN);
. 이제, (나는 하나의 printf 그것을 밖으로 인쇄 할 경우)이 방법은 선언 10 ~ 20 포인터를 필요로하고, 나는 같은 간단한 사용하는 거라고 :
char* getFieldVal(PGresult* res, int row, char* fieldName)
{
static char tmp[1000];
memset(tmp, 0, sizeof(tmp));
// Load data here...
return tmp;
}
을하고 전화를 printf
같은 :
printf("%s,%s,%s..(so on...)...%s",
getField(r, 0, "A"), getField(r, 0, "B"), ... , getField(r, 0, "N"));
의 printf
기능의 출력은 (그냥 이전의 문자열을 삭제 한 경우에도 모든 getField
호출 (이 경우에 A
필드의 값을) 먼저 데이터베이스에서 요청 된대로 반환하는 것을 나타내는한다 물론) memset
전화와 함께.
어디서 잘못 되었나요? 내 코드에 뭔가가 있거나 gcc에서 모든 getField 호출이 동일한 메모리에 포인터를 반환한다고 가정하므로 실제로 여러 번 호출하지는 않습니다.
또는 먼저 printf
은 모든 매개 변수를 역순으로 평가 한 다음 실제로 함수를 호출합니까? 이것이 사실이라면 (그리고 나는 그것이 내기 일 것입니다), 제가 시도하고있는 것을 성취하기위한 더 간단한 패턴이 있습니까?
난 당신이 정적 배열을 사용하고 (printf와에 호출하기 때문에하지 틀렸다 경우는) 그 정의가 없습니다 :
함수에서 시작, 당신과 함께
row
에 대한fieldName
의 값으로 포인터를 얻을 수 있습니다 C의 행동? –포인트는 같은 메모리에 포인터를 반환하고 있으므로 마지막 표현식이 평가 된 후에 그 포인터가 세 번 인쇄됩니다. – teppic
예, 그렇습니다 (마지막 단락 참조). 실제로 함수를 호출하기 전에 모든 매개 변수를 평가해야하기 때문에 실제로 이해할 수 있습니다. –