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

Red hat linux 5.6 g++ rpm包在哪里下载?

Red Hat Linux6.8 中的安装ActiveMQ 5.14.1