Dobrý den všem,
Narazil jsem v jazyce C na pro mě zatím nepochopitelné chování při předávání dat do funkce.
Zde je zdrojový kód funkce:
char* toCharStr(char *str, char *ptr, unsigned long size) {
char log1[500] = "";
char log2[500] = "";
sprintf(log1, "echo Size before:str%u: ptr:%u: >> $MQ_DEBUG_LOG", sizeof (str), sizeof (ptr));
//memcpy(str, ptr, size);
memcpy(str, ptr, sizeof(ptr));
sprintf(log2, "echo Size after:str%u: ptr:%u: >> $MQ_DEBUG_LOG", sizeof (str), sizeof (ptr));
str[sizeof (str)] = '\0';
system(log1);
system(log2);
return str;
}
Zde je zdrojový kód, odkud se volá:
void addLogEntry(ExitTypeEnum Type, PMQAXP pExitParms, PMQAXC pExitContext, PPMQMD ppMsgDesc, PPMQGMO ppGetMsgOpts, PPMQPMO ppPutMsgOpts, PMQLONG pBufferLength) {
int i;
char logdata[1000] = "";
char logdata1[1000] = "";
char logdata2[1000] = "";
char logdata3[1000] = "";
char logdata4[1000] = "";
char strResolvedQName[49] = "";
char strResolvedQNameTMP[49] = "";
MQMD* pMsgDesc = *ppMsgDesc;
MQGMO* pGetMsgOpts;
MQPMO* pPutMsgOpts;
switch (Type) {
case Type_GetAfter:
break;
case Type_PutAfter:
case Type_Put1After:
pPutMsgOpts = *ppPutMsgOpts;
memcpy(strResolvedQNameTMP, pPutMsgOpts->ResolvedQName, sizeof (MQCHAR48));
strResolvedQNameTMP[sizeof (strResolvedQNameTMP)] = '\0';
sprintf(logdata4, ";ResolvedQName_%s_;", toCharTrim(strResolvedQName, pPutMsgOpts->ResolvedQName, sizeof (MQCHAR48)));
strcat(logdata, logdata4);
strcat(logdata, rtrim(strResolvedQNameTMP));
break;
};
PutToLoggingQueue(logdata, pExitParms, pExitContext);
return;
}
Pokud si zobrazím sizeof strResolvedQName je přesně 49 bajtů ale pokud jej předám do funkce pak má sizeof pouze 8 bajtů. Stejná situace nastane i pro ptr.
Můj problém tedy je, že nerozumím, co dělám špatně při předávání dat do funkce toCharStr
Pokud použiju zdrojový kód mé funkce přímo, pak je vše v pořádku.
Pokud zde nejsou uvedeny všechny důležité věci, pak rád doplním.