我想连接两个指针变量。尝试不同的方法但失败,找不到资源 - 找不到地址错误出现。
仅供引用:Tizen 可穿戴 SDK 3.0 Samsung Gear S2 watch
尝试1:
char *idP;
//finalFrame is pointer array.
//finalFrame is char Array char *finalFrame[25]
char *id1 = finalFrame[6]; //0
char *id0 = finalFrame[7]; //3
dlog_print(DLOG_INFO, LOG_TAG, "id0 : %d", id0); // output: id1 : 0
dlog_print(DLOG_INFO, LOG_TAG, "id1 : %d", id1); // output: id1 : 3
if((idP = (char *)malloc(strlen(id0) + strlen(id1) + 1)) != NULL){ // appcrash here
*idP='\0';
strcpy(idP, id1);
strcat(idP, id0);
dlog_print(DLOG_INFO, LOG_TAG, "-----idP %s",idP);
}else{
dlog_print(DLOG_INFO, LOG_TAG, "No memory");
}
尝试2:
char *idP=concat(id1,id0);
dlog_print(DLOG_INFO, LOG_TAG, "-----id : %s", idP); // but failed
//method
char * concat(char *str1, char *str2) {
char *conc = str1;
while (*str1 != '\0')
str1++;
*str1 = ' ';
++str1;
while (*str2 != '\0') {
*str1 = *str2;
str1++, str2++;
}
*str1 = '\0';
//printf("Concatenated String:\n");
//puts(conc);
dlog_print(DLOG_INFO, LOG_TAG, "%s", conc);
return conc;
}
尝试 3:
char *prefixAry[2];
char *prefix = malloc(sizeof(char) * strlen(prefixAry) + 1);//+1 for the zero-terminator;
*prefix = '\0';
strcat(prefix, prefixAry[0]); //any value set
strcat(prefix, prefixAry[1]); //any value set
dlog_print(DLOG_INFO, LOG_TAG, "-----Prefix : %s", prefix);
我做的对吗?请帮忙。
实际上我正在解析来自 BLE 芯片的帧。我必须对其进行解码并获取信息,然后将其显示在 UI 上。所以选择数组。
如果有任何不同的方法适用,请查看我的其他问题:ISSUE1
提前致谢。 问候。
最佳答案
关于你的尝试1
鉴于 finalFrame
是指针数组,这些声明和它们的初始值设定项没问题:
char *id1 = finalFrame[6]; //0 char *id0 = finalFrame[7]; //3
但它们似乎与这些打印语句中的格式不符:
dlog_print(DLOG_INFO, LOG_TAG, "id0 : %d", id0); // output: id1 : 0 dlog_print(DLOG_INFO, LOG_TAG, "id1 : %d", id1); // output: id1 : 3
假设 dlog_print()
使用 printf
的格式字符串语言,如果你想打印指针本身的值,那么你应该使用 % p
字段描述符,而不是 %d
。如果您打算打印它们指向的字符数组的内容(假设它们以 null 结尾),那么您将使用 %s
。使用 %d
会产生未定义的行为,但我准备推测第一个 dlog_print()
输出“0”这一事实表明 id0
的值是空指针,第二个输出“3”的事实表明 id1
的值可能不是有效指针。
如果 id0
和 id1
是指向以 null 结尾的字符数组的有效指针,那么 try 1 的其余部分就没问题,但事实上你会崩溃在下一行:
if((idP = (char *)malloc(strlen(id0) + strlen(id1) + 1)) != NULL){ // appcrash here
倾向于支持您的一个或两个指针无效的假设。
关于尝试2
这依赖于第一个参数指向的数组中有足够的未使用空间来容纳第二个指向的字符串的内容,加上您在两者之间插入的空间(如果参数确实存在,则终止符已经被考虑在内)指向一个以 null 结尾的字符串)。当满足该条件时,并且参数实际上首先是指向以 null 结尾的字符串的有效指针,它应该可以正常工作。
关于尝试3
鉴于此声明:
char *prefixAry[2];
...这个分配尝试是不正确的:
char *prefix = malloc(sizeof(char) * strlen(prefixAry) + 1);//+1 for the zero-terminator;
首先,prefixAry
没有被初始化。如果它有文件作用域,那么它的元素将默认初始化为空指针;否则,它的初始值是不确定的。您不能出于您的目的那样使用它,所以让我们继续假设它已被初始化:
char *prefixAry[2] = { "one", "two" };
但是,这仍然没有保存分配,因为它依赖于 strlen(prefixAry)
。 strlen()
的参数必须是指向以 null 结尾的 char
数组的指针,而这不是您提供的。 sizeof()
也不正确,因为它会得到两个指针 的组合大小,而您需要它们指向的数据的大小。
为了挽救这个,你需要类似的东西
char *prefix = malloc(strlen(prefixAry[0]) + strlen(prefixAry[1]) + 1);
请注意,根据定义,sizeof(char)
为 1,并且此分配现在等同于您的“Try 1”中的分配。
在分配了足够的空间后,此替代方案中基于strcat()
的方法是可行的。
关于c - 连接指针变量失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43638637/