C 中的自定义函数在 Red Hat Linux 中不起作用,但在 HPUX 中可以
Posted
技术标签:
【中文标题】C 中的自定义函数在 Red Hat Linux 中不起作用,但在 HPUX 中可以【英文标题】:custom function in C doesn't work in Red Hat Linux but yes in HPUX 【发布时间】:2014-07-09 06:48:28 【问题描述】:我有一个模拟 Visual Basic mid 函数的函数 C。此代码在 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" RHEL => 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 "";
【问题讨论】:
unsigned inicio; ... = inicio-1
看起来不太好。
这是非常复杂的寻找它的作用。另外,please don't cast the return value of malloc()
in C.
就流程、结构、cmets 而言,这是非常可怕的代码......
不要编写 K&R 代码,即使在 HP-UX 上也是如此。如果您买不起 HP ANSI C 编译器,请安装 GCC。无论哪种方式,都不需要编写非原型函数。
Using pointer after free()的可能重复
【参考方案1】:
这个:
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。这意味着您的使用 sn-p 不起作用,因为它通过将返回的指针传递给 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;
【讨论】:
【参考方案2】:在返回 main() 之前,您正在释放 p
。具体问题在这里:
if (pidio_memoria)
*(p + i - start) = '\0';
//free (p);
return p;
一旦你摆脱了free(p)
,你的函数就会产生输出:
tipo = ab
祝你好运。
【讨论】:
以上是关于C 中的自定义函数在 Red Hat Linux 中不起作用,但在 HPUX 中可以的主要内容,如果未能解决你的问题,请参考以下文章
Linux - Red Hat 7.3 ????????????
无法访问 Red Hat Linux Server 中的 UI 组件
红帽 Red Hat Linux相关产品iso镜像下载百度云更新7.2
Red Hat Enterprise Linux Server 6.5安装GCC 4.9.2