一旦在函数内初始化,就为一个字符数组的元素赋值

时间:2014-12-19 19:43:48

标签: c pointers

所以这就是我要做的事情;通过使用memcpy将两个字符数组连接在一起。部分原因是因为我使用的是u_chars,但是对于这个例子,我们将只使用字符并使用strlen来获得字符串的长度以简化。

基本上,我采取的步骤是:

  • 创建一个新指针,表示我的组合字符串(char * name)
  • 将指针的地址传递给一个函数(这样一个对指针的引用)以及我想要一起添加的两个指针
  • 将取消引用的未初始化指针设置为我想要的新内存分配的内存地址(这样可以正常工作)
  • 将第一组数据复制到这个新位置(这也可以正常工作)
  • 将第二组数据复制到这个新位置,再加上一些代表第一组数据长度的地方(这也可以正常工作)
  • 将此指针数据的最后一个字符设置为空终止字符(' \ 0)

......这就是一切都会死的地方。尝试写入位置0x00000000时,出现访问冲突错误。但是,指针肯定存在。下面是代码(使用VS2013用Visual C ++编写)

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * name;
char * firstpart;
char * lastpart;

void addstrings(char ** result, char * body, char * prefix)
{
   int x = strlen(prefix);
   int y = strlen(body);


   *result = (char *)malloc((x + y + 1) * sizeof(char));

   memcpy(*result,      prefix,  x);
   memcpy(*result + x,  body,    y);



   *result[x + y] = '\0';     // Exception is thrown writing to memory address 0x00000000
}

int _tmain(int argc, _TCHAR* argv[])
{
   firstpart = "stack";
   lastpart = "overflow";

   addstrings(&name, firstpart, lastpart);
   return 0;
}

以下替换允许程序继续,在检查时显示字符串存在

result[x + y] = '\0';

但这不会设定任何价值;这可能是正确的&#34;结果&#34;在这个例子中仍然只是对指针的引用,而不是指针本身(我想修改这个指针的地址的内容,它本身就是一个指针,但我需要先将它取消引用一个级别)。

要清楚;我知道有很多方法(strcpy,如果我使用string.h)但是如果我使用u_char类型或类似的东西,这将无法工作。另外,我可以修改上面的内容,如下工作正常:

char * addstrings(char * result, char * body, char * prefix)
{
   int x = strlen(prefix);
   int y = strlen(body);


   result = (char *)malloc((x + y + 1) * sizeof(char));

   memcpy(result,      prefix,  x);
   memcpy(result + x,  body,    y);



   result[x + y] = '\0';

   return result;
}
  • 现在返回类型为 char *
  • 使用指向输出字符串的指针而不是对指针的引用
  • 删除了函数
  • 中的所有解除引用
  • 返回指针

现在,函数调用如下所示:

name = addstrings(name, firstpart, lastpart);

这样可以正常工作。但我只是好奇这个问题究竟是什么以及为什么我不能为指针指向的数组中的元素赋值(但我可以在第二个例子中)。

非常感谢任何评论或想法,

谢谢!

1 个答案:

答案 0 :(得分:3)

只需添加此

即可
(*result)[x + y] = '\0';

数组下标[]运算符的优先级高于解引用运算符*

另请注意,您的功能的第二个版本没问题,但您无需传递

char *result

作为参数。

在第一种情况下,间接由[]运算符首先执行,然后您将留下无效指针。