首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C中的自定义函数在中不起作用,但在HPUX中是有效的

C中的自定义函数在中不起作用,但在HPUX中是有效的
EN

Stack Overflow用户
提问于 2014-07-09 06:48:28
回答 2查看 91关注 0票数 0

我有一个函数C,它模拟Visual中间函数。此代码在HPUX中工作,但在RHEL中不起作用。例如:

代码语言:javascript
运行
复制
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 =(空)

有什么问题吗?

代码语言:javascript
运行
复制
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 "";
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-09 07:05:14

这是:

代码语言:javascript
运行
复制
    free(p);
    return p;

是调用方使用返回的字符串指针后立即出现的未定义行为。

以下是我的尝试:

代码语言:javascript
运行
复制
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(),从而删除它。

它必须是:

代码语言:javascript
运行
复制
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;
}
票数 3
EN

Stack Overflow用户

发布于 2014-07-09 08:11:25

在返回main()之前,您正在释放p。具体而言,问题在于:

代码语言:javascript
运行
复制
if (pidio_memoria) {
*(p + i - start) = '\0';

//free (p);
return p;

一旦摆脱了free(p),函数就会产生输出:

代码语言:javascript
运行
复制
tipo = ab

祝好运。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24647024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档