我想连接两个指针变量。尝试不同的apporch但失败,找不到资源 - 找不到地址错误来了。
仅供参考:Tizen可穿戴SDK 3.0三星Gear S2手表
Try1:
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");
}
Try2:
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上显示它。所以选择数组。
如果任何不同的approch适用,请查看我的其他问题:https://plnkr.co/edit/l22Ir7?p=preview
提前致谢。 问候。
答案 0 :(得分:3)
鉴于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
字段描述符,而不是{{1 }}。如果您打算打印它们指向的字符数组的内容(假设它们以空值终止),那么您将使用%d
。使用%s
产生未定义的行为,但我准备推测第一个%d
输出“0”表示dlog_print()
的值是空指针的事实,以及事实第二个输出“3”表示id0
的值可能不是有效指针。
如果id1
和id0
是指向以null结尾的字符数组的有效指针,那么try 1的其余部分就可以了,但事实是你在下一行遇到了崩溃:< / p>
id1
倾向于支持一个或两个指针无效的假设。
这依赖于第一个参数所指向的数组中有足够的未使用空间来容纳第二个指向的字符串的内容,加上你插入的空间(如果参数确实已经解释了终结符)指向以null结尾的字符串)。当满足该条件,并且参数实际上是首先是以空字符结尾的字符串的有效指针时,它应该可以正常工作。
鉴于此声明:
if((idP = (char *)malloc(strlen(id0) + strlen(id1) + 1)) != NULL){ // appcrash here
...此分配尝试不正确:
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()
数组的指针,而这不是您提供的数组。 char
也不是正确的,因为它会得到两个指针的组合大小,而你需要它们指向的数据的大小。
要拯救这个,你需要像
这样的东西sizeof()
请注意,根据定义, char *prefix = malloc(strlen(prefixAry[0]) + strlen(prefixAry[1]) + 1);
为1,此分配现在等同于“尝试1”中的分配。
在分配了足够的空间后,基于sizeof(char)
的方法可行。