#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
int i=0;
char** f=NULL;
char* ff=NULL;
ff="abcd";
f=( char**)malloc ((i + 1) * sizeof (char *)+5);
f[0]=ff;
// strcpy(f[0],ff); (this again giving same error)
strncat(f[0],"efg",3);
printf("f : %s",f[0]);
}
我收到一些未处理的异常,Access违规写入错误。任何人都可以解释我在这里做的错误。 注意:抱歉,我现在修改了代码:
感谢您的回答
答案 0 :(得分:5)
您正在设置f&lt; -ff
ff指向常量char [](“abcd”)的开头
然后你改变* f的值(这正好是* ff)因此 - 访问冲突。
答案 1 :(得分:5)
第二次分配给f
实际上删除了第一次分配。要复制原始字符串,您必须使用strcpy。另外,请注意在malloc中保留足够的空间。它必须是"abcd"
的前四个字符加上另外三个加"efg"
加一个(结尾\0
):
f = (char*)malloc(9); // 5+3+1
strcpy(f, ff);
strncat(f, "efg", 3);
答案 2 :(得分:3)
您正在为ff指定f。 所以你试图连接一个const字符串。 简而言之,当你想在malloced区域进行连接时。
strncat(f,"efg",3);
你其实是这样做的。
strncat(ff,"efg",3);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *concat(const char *a, const char *b) {
size_t la = strlen(a);
size_t lb = strlen(b);
char *ret= (char*) malloc( la + lb + 1 /* for \0 */);
memcpy(ret,a,la);
memcpy(ret+la,b,lb);
ret[la+lb] = '\0';
return ret;
}
void main()
{
char* f=NULL;
char *f =concat("abcd","efg");
printf("f : %s",f[0]);
free(f);
}
答案 3 :(得分:1)
您正在尝试连接到不可写的ff。这就是您获得访问冲突的原因。
您正在设置{f}指向ff的f = ff
。这也会导致内存泄漏。
ff
在代码段中声明,该段不可写,并且在其上写入会导致未定义的行为。您的案例中未定义的行为是访问冲突错误。
答案 4 :(得分:1)
Sooo很多东西:
首先,这是一个字符串文字,应该是const
char* ff="abcd"; // should not do this
const char* ff = "abcd"; // instead
接下来是你的malloc
- argh
f=( char*)malloc ((i + 1) * sizeof (char *)+5);
您要做的是分配5个字符(i + 1 == 1)
,您还得到sizeof
指针(char*
)而不是char
f=( char*)malloc (5 * sizeof (char));
接下来是:
f=ff;
实际上你已经覆盖了以前的分配,现在f
指向ff
,这就是strncat
失败的原因!但是,即使您没有这样做,strncat
也会失败,因为f
您malloc
d将不包含NUL终止字符串,并且您将在任何地方都有鼻守护进程。
因此,删除上面的赋值,并memset
新分配的块到0
,您的代码可能正常工作。如果您使用的是C ++,那么您所做的就等同于
std::string f("abcd");
f.append("efg");
编辑:我已经删除了这个以指出代码中的错误,而不仅仅是它失败的原因......
答案 5 :(得分:1)
char* ff="abcd";
"abcd"
为const char*
,而不是char*
f=( char*)malloc ((i + 1) * sizeof (char *)+5);
i
为0,您的意思是strlen(ff)+1
char *
代替char
5
只是困惑?f=ff;
f
设置为与ff
相同的指针值,即make f
指向相同的const字符串"abcd"
f=malloc
strncat(f,"efg",3);
3
太少,应该包含尾随\0
- 使用至少4来复制整个"efg"
malloc
中使用的大小
(或者更准确地说是源和目的地大小的最小值。)printf("f : %s",f);
\n
(换行符)答案 6 :(得分:0)
char *ff;
ff = "whatever";
ff
被分配了一个字符串文字,无法更改。这段字符串存储在linux中可执行文件的.rodata
区域中,以及其他类型可执行文件中的类似只读区域。因此,在分配字符串文字ff = "whatever"
ff
后,内存中的地址为只读。通过执行:char f[0] = ff
然后尝试修改实际指向f[0]
的字符串ff
,该字符串再次指向存储在内存中的字符串whatever\0
的基址。只读,您尝试修改,操作系统阻止您进行操作。
你要么:
char *ff;
ff = malloc (sizeof (char) * SIZE_OF_YOUR_CHOICE);
strcpy (ff, "whatever");
/* now do what ever modification (within the size limits) */
free (ff);
或者你这样做:
char ff[SIZE_OF_YOUR_CHOICE] = "whatever";
/* not do whatever modification (within the size limits) */