所以这就是我要做的事情;通过使用memcpy将两个字符数组连接在一起。部分原因是因为我使用的是u_chars,但是对于这个例子,我们将只使用字符并使用strlen来获得字符串的长度以简化。
基本上,我采取的步骤是:
......这就是一切都会死的地方。尝试写入位置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;
}
现在,函数调用如下所示:
name = addstrings(name, firstpart, lastpart);
这样可以正常工作。但我只是好奇这个问题究竟是什么以及为什么我不能为指针指向的数组中的元素赋值(但我可以在第二个例子中)。
非常感谢任何评论或想法,
谢谢!
答案 0 :(得分:3)
只需添加此
即可(*result)[x + y] = '\0';
数组下标[]
运算符的优先级高于解引用运算符*
。
另请注意,您的功能的第二个版本没问题,但您无需传递
char *result
作为参数。
在第一种情况下,间接由[]
运算符首先执行,然后您将留下无效指针。