当前位置: 首页 > 知识库问答 >
问题:

需要一些关于malloc的解释吗

唐泳
2023-03-14

我不明白,当我为5分配内存时,它会打印出一个示例。我知道可以使用strncpy来完成,但有没有一种方法可以不使用strncpy来完成呢

它适用于strncpy,但有没有办法在没有strncpy的情况下做到这一点?

void main()
{

    char *a;

    a=(char*)malloc(5);

    a="OneExample";
    printf("%s",a);

    free(a);

}

打印出一个示例

不应该打印OneE吗??有人能解释一下吗?

void main()
{

    char *a;

    a=(char*)malloc(5);

    a="OneExample";
    printf("%s",a);

    free(a);

}

共有3个答案

贺君浩
2023-03-14

>

  • 要使用malloc,您需要包括

    • 首先,您丢失了malloc(3)给出的指针值,该值存储在a中,因此您不再拥有它,您将永远无法释放它。这称为内存泄漏,您应该避免这些,因为它们是编程错误
    • 这将在对free(3)的调用中产生某种未定义的行为,该行为只接受以前由malloc返回的指针值作为参数(而这不是存储在a中的实际地址)。可能您得到了一些SIGSEGV中断,并且您的程序从此调用中崩溃

    当您对a进行赋值时,您只是更改存储在其中的指针值,而不是延迟的内存内容,因此这就是调用strcpy(3)的意义,因为它是复制字符串的唯一方法。或者您可以一个接一个地复制字符,如下所示:

    char *a = malloc(5);  /* this makes a memory buffer of 5 char available through a */
    int i;
    for(i = 0; i < 4 /* see below */; i++)
        a[i] = "OneExample"[i]; /* this is the copy of the char at pos i */
    a[i] = '\0'; /* we must terminate the string if we want to print it */
    

    最后一个步骤是,当i

    有一个标准库可供选择,它是:

    char *a = strdup("OneExample");
    

    这相当于:

    #define S "OneExample"
    char *a = malloc(strlen(S) + 1); /* see the +1 to allow for the null terminator */
    strcpy(a, S);
    

    但是,如果您想在5处截断字符串来解决您的示例,可以执行以下操作:

    char *dup_truncated_at(const char *s, int at)
    {
        char *result = malloc(at + 1); /* the size we need */
        memcpy(result, s, at); /* copy the first at chars to the position returned by malloc() */
        result[at] = '\0';  /* and put the string terminator */
        return result; /* return the pointer, that must be freed with free() */
    }
    

    你可以称之为:

    char *a = dup_truncated_at("OneExample", 5);
    printf("truncated %s\n", a);
    free(a);  /* remember, the value returned from dup_truncated_at has been obtained with a call to malloc() */
    

  • 子车凌龙
    2023-03-14

    我不明白,当我为5分配内存时,它会打印出一个示例。我知道可以使用strncpy来完成,但有没有一种方法可以不使用strncpy来完成呢

    它适用于strncpy,但有没有办法在没有strncpy的情况下做到这一点?

    您也可以使用memcpy()<阅读关于memcpy()的内容,并检查一下。

    似乎您对C中的指针有一些误解。请看这部分代码:

        a=(char*)malloc(5);
    
        a="OneExample";
        printf("%s",a);
    
        free(a);
    

    您正在将内存分配给指针a,然后立即将其指向字符串文字。

    这是代码中的内存泄漏,因为您丢失了所分配内存的引用。

    您应该知道,free()释放先前由malloc()、calloc()或realloc()分配的空间,否则行为未定义
    在程序中,您试图释放字符串文字“OneExample”的内存,这将导致未定义的行为。

    使用memcpy(),您可以执行:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main (void) {
        char *a = malloc(5);
    
        if (a == NULL) {
            fprintf (stderr, "Failed to allocate memory\n");
            exit(EXIT_FAILURE);
        }
    
        memcpy (a, "OneExample", 4);   // copy 4 characters to a, leaving space for null terminating character
    
        a[4] = '\0';      // make sure to add null terminating character at the end of string
    
        printf("%s\n",a);
    
        free(a);
    
        return 0;
    }
    

    附加:

    >

    遵循良好的编程实践,始终检查malloc返回。

    不要施放malloc返回。

    斜光耀
    2023-03-14

    您没有使用分配的内存。分配内存后,使用指向字符串文字的指针重写指针a,导致内存泄漏。由于您在未分配malloc的指针上调用free,因此后续调用free也可能导致应用程序崩溃。

    如果您想使用分配的空间,您可以复制到它(例如... g,通过使用strncpy)。

     类似资料:
    • 我想知道这里的日常工作是如何进行的。 获取以下错误: *****我是主要的围棋套路***** 等待消息的主例程 goroutine 5[chan receive]: main.main.func1(0xC420054060) /users/work/go/src/github.com/golang_play/goroutine/goroutine.go:13+0x98由main.main/user

    • 现在,编辑器在使用注释方法的地方显示警告。然后显示使用的建议。当我接受它的更改时,它会将代码转换为此,警告消失。 使用有意义吗? 实现是 所以如果为空,我的代码仍然会崩溃。 我们应该对此进行空检查。 我认为比好,你说呢?如果是,则编辑器不应建议在此处使用。 因为在具有状态(如)的字段中使用要求NonNull是不安全的。我是否错过了的一些好处?

    • 这是实现我的项目的CRUD操作的类的整个代码: 好的,正如您所看到的,使用@Transactional注释对一些方法进行了注释。 我正在阅读官方文档http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/transaction.html中关于该注释在方法上的使用,它看到了:使用@transac

    • 问题内容: 我从未使用过支付网关做任何事情,有人可以给我建议吗? 问题答案: 支付网关因国家/地区而异,它们是可以在您的应用程序中启用付款处理的代理机构。 例如。在英国,BT拥有付款网关。他们称其为BTBuynet。在印度,ICICI是主要的支付网关提供商之一。您也可以签出paypal。 他们每个人都有自己的实现方式。通常每个付款网关都有2种付款处理方式。 付款页面 :这是最常用的 页面 之一。网

    • 问题内容: 我通过“ SHOW INNODB STATUS”收到了以下死锁日志。有人可以解释一下为什么交易被中止吗?似乎事务2持有该锁,但也卡住以请求相同的锁(“等待”部分除外),当事务1也需要它时,这将导致死锁。 问题答案: 第一步是确定两个查询是什么: SELECT API_KEY,完成,创建,删除,标记,,GROUP_ID,主机名,,JID,标签,语言,优先,,重新启动,状态,类型,UID,

    • Hibernate collections 被当作其所属实体而不是其包含实体的一个逻辑部分。这非常重要,它主要体现为以下几点: 当删除或增加 collection 中对象的时候,collection 所属者的版本值会递增。 如 果一个从 collection 中移除的对象是一个值类型(value type)的实例,比如 composite element,那么这个对象的持久化状态将会终止,其在数据