我不明白,当我为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);
}
>
当您对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() */
我不明白,当我为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返回。
您没有使用分配的内存。分配内存后,使用指向字符串文字的指针重写指针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,那么这个对象的持久化状态将会终止,其在数据