我有一个函数C,它模拟Visual中间函数。此代码在HPUX中工作,但在RHEL中不起作用。例如:
main()
{
char tipo[3];
char nombre[10];
strcpy (nombre,"abcdefg");
strcpy (tipo,lds_mid(nombre,1,2));
printf ("tipo = %s\n",tipo);
}结果:
HPUX => tipo = "ab“=> tipo =(空)
有什么问题吗?
char *lds_mid (cadena,inicio,longitud)
char *cadena; unsigned inicio; unsigned longitud;
{
int start, length;
int i;
char *p;
int pidio_memoria;
start = inicio-1;
length = longitud;
if (inicio ==0) {
start = 1;
length --;
}
pidio_memoria = 0;
for (i=start;(cadena[i]!='\0') && ((i-start)<length);i++) {
if (i==start) {
p = (char *) malloc(2*sizeof(char));
pidio_memoria = -1;
if (p == NULL) {
/*printf("\nMemoria agotada\n"); */
abort();
}
}
else {
p = (char *) realloc((void *)p,(i-start+ 2)*sizeof(char));
if (p ==NULL) {
/*printf("\nMemoria agotada\n"); */
abort();
}
}
*(p+i-start)=cadena[i];
}
if (pidio_memoria) {
*(p+i-start) = '\0';
free(p);
return p;
}
else
return "";
}发布于 2014-07-09 07:05:14
这是:
free(p);
return p;是调用方使用返回的字符串指针后立即出现的未定义行为。
以下是我的尝试:
char * lds_mid(const char *string, size_t offset, size_t length)
{
if(string == NULL)
return NULL;
const size_t slen = strlen(string);
if(offset >= slen)
return NULL;
const size_t chunk = offset + length > slen ? slen - offset : length;
char *out = malloc(chunk + 1);
if(out != NULL)
{
memcpy(out, string + offset, chunk);
out[chunk] = '\0';
}
return out;
}这就是我所期望的这样一个函数是多么复杂。在这个函数中,不需要调用realloc()。
请注意,上面给出了调用方对返回字符串的所有权,当不再需要时,它必须是free()d。这意味着您的使用代码段不起作用,因为它将返回的指针传递给strcpy(),从而删除它。
它必须是:
int main(void)
{
const char *str = "hello, world!"; /* String to cut part from. */
char *world = mid(str, 7, 5);
printf("'%s' ends with '%s'\n", str, world);
free(world);
return 0;
}发布于 2014-07-09 08:11:25
在返回main()之前,您正在释放p。具体而言,问题在于:
if (pidio_memoria) {
*(p + i - start) = '\0';
//free (p);
return p;一旦摆脱了free(p),函数就会产生输出:
tipo = ab祝好运。
https://stackoverflow.com/questions/24647024
复制相似问题