这段代码有什么问题..关于strncat

时间:2011-06-01 12:13:51

标签: c++ c visual-c++

抱歉,我现在修改了代码:

#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违规写入错误。任何人都可以解释我在这里做的错误。 注意:抱歉,我现在修改了代码:

感谢您的回答

7 个答案:

答案 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也会失败,因为fmalloc 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) */