在导致 SIGSEVG 的函数参数中填充一个 char **
Fill a char ** in function argument lead to SIGSEVG
我想从一个函数中填充一个 char ** 变量。当我在填充函数之外使用填充值时,出现错误。
代码 139(被信号 11 中断:SIGSEGV)
这是我的填充函数
int read(char ** tag_ids, int * nbtag)
{
......
// Loop through tags
*nbtag = tagCount;
tag_ids = (char**)malloc(tagCount * sizeof(char*));
for (idx = 0; idx < tagCount; idx++) {
error = readtag( idx, &tagData);
tag_ids[idx] = (char *)malloc(sizeof(char)* (tagData.epcLen+1));
if( tag_ids[idx] == NULL) {
printf("error \n");
}
strcpy(tag_ids[idx], epcStr);
printf("strcpy length %d data %s \n", tagData.epcLen, epcStr); // data OK
printf(" strcpy length %d data %s \n", tagData.epcLen, tag_ids[idx]); // data OK
}
return 0;
}
当我使用该功能时:
char ** tagid = NULL;
int nbtag;
int error = read(tagid,&nbtag);
for (int i = 0 ; i<nbtag; i++){
printf("---> tag index : %d/%d \n", i, nbtag);
if( tagid == NULL) {
printf("NULL pointer \n"); // Detect pointer NULL why ???
}
if( tagid[i] == NULL) {
printf("NULL pointer \n");
}
printf("---> tag index : %d id %s \n", i, tagid[i]); // SIGSEGV
}
我认为函数参数中的 char ** 变量是原始变量的副本,但我真的不明白如何从函数中填充 char ** 。
在此代码段中
char ** tagid = NULL;
int nbtag;
int error = read(tagid,&nbtag);
指针tagid
按值传递给函数read
。也就是说,该函数处理原始指针值的副本。更改副本不会影响原始指针。
您需要通过指向它的指针按引用传递指针。那就是函数应该像
这样声明
int read(char *** tag_ids, int * nbtag)
并称赞
int error = read(&tagid,&nbtag);
我想你可以找到一个完整的答案,但是如果你想修改一个 char** 变量的值并在函数之外使用它,你需要使用 char*** 传递参数通过引用
确实,您正在分配变量的副本。
检查这个的一个好方法是在函数的外部和内部打印 &tag_ids
。你会看到值是不同的。如果要在函数内部分配双指针,则需要传递要分配的变量的引用。即:
int func(char ***tag_ids, int *nbtag) {
*tag_ids = (char **)malloc(...);
...
}
并像这样调用函数:
char **tagids = NULL;
int nbtag = 0;
int error = func(&tagids, &nbtag);
我想从一个函数中填充一个 char ** 变量。当我在填充函数之外使用填充值时,出现错误。
代码 139(被信号 11 中断:SIGSEGV)
这是我的填充函数
int read(char ** tag_ids, int * nbtag)
{
......
// Loop through tags
*nbtag = tagCount;
tag_ids = (char**)malloc(tagCount * sizeof(char*));
for (idx = 0; idx < tagCount; idx++) {
error = readtag( idx, &tagData);
tag_ids[idx] = (char *)malloc(sizeof(char)* (tagData.epcLen+1));
if( tag_ids[idx] == NULL) {
printf("error \n");
}
strcpy(tag_ids[idx], epcStr);
printf("strcpy length %d data %s \n", tagData.epcLen, epcStr); // data OK
printf(" strcpy length %d data %s \n", tagData.epcLen, tag_ids[idx]); // data OK
}
return 0;
}
当我使用该功能时:
char ** tagid = NULL;
int nbtag;
int error = read(tagid,&nbtag);
for (int i = 0 ; i<nbtag; i++){
printf("---> tag index : %d/%d \n", i, nbtag);
if( tagid == NULL) {
printf("NULL pointer \n"); // Detect pointer NULL why ???
}
if( tagid[i] == NULL) {
printf("NULL pointer \n");
}
printf("---> tag index : %d id %s \n", i, tagid[i]); // SIGSEGV
}
我认为函数参数中的 char ** 变量是原始变量的副本,但我真的不明白如何从函数中填充 char ** 。
在此代码段中
char ** tagid = NULL;
int nbtag;
int error = read(tagid,&nbtag);
指针tagid
按值传递给函数read
。也就是说,该函数处理原始指针值的副本。更改副本不会影响原始指针。
您需要通过指向它的指针按引用传递指针。那就是函数应该像
这样声明int read(char *** tag_ids, int * nbtag)
并称赞
int error = read(&tagid,&nbtag);
我想你可以找到一个完整的答案
确实,您正在分配变量的副本。
检查这个的一个好方法是在函数的外部和内部打印 &tag_ids
。你会看到值是不同的。如果要在函数内部分配双指针,则需要传递要分配的变量的引用。即:
int func(char ***tag_ids, int *nbtag) {
*tag_ids = (char **)malloc(...);
...
}
并像这样调用函数:
char **tagids = NULL;
int nbtag = 0;
int error = func(&tagids, &nbtag);