我正面临一个问题,我当然做错了什么。 我需要调用一个返回指向int数组的指针的函数,但是当它返回后,数组中的值是错误的,并且缺少一些值。
int* patternForFirstDigit(int digit) {
int *pattern;
pattern = (int [6]){1,1,1,1,1,1};
switch (digit) {
case 0:
pattern = (int [6]){1,1,1,1,1,1};
break;
case 1:
pattern = (int [6]){1,1,2,1,2,2};
break;
default:
pattern = (int [6]){0,0,0,0,0,0};
break;
}
for (int i = 0; i < 6; i++) {
printf("%i\n", pattern[i]);
}
return pattern;
}
如果是数字= 1,这是打印的内容
1, 1, 2, 1, 2, 2
但回来后
int *pattern = patternForFirstDigit(0);
for (int i = 0; i < 6; i++) {
printf("%i\n", pattern[i]);
}
这是打印的内容
1, -1405451528, -1405449120, 366001
你知道出了什么问题吗?
谢谢你们
PS:我正在使用Xcode 4.6而我的项目正在使用ARC,但我很确定这不是我问题的原因。答案 0 :(得分:5)
您无法返回指向函数中创建的数组的指针。函数返回后,此数组不再存在,因此指针指向内存中的某个随机,无效的位置。
为指针分配内存(例如,使用malloc()
),然后返回指针。这也意味着你需要在完成它后释放一个指针(使用free()
)。
伪代码就像这样:
int* patternForFirstDigit(int digit) {
int *pattern = (int*) malloc(sizeof(int)*N);
pattern[0] = 0;
pattern[1] = 1;
...
// Alternatively just create a local array and use a for-loop
// to copy the contents to the pattern array.
return pattern;
}
int *p = patternForFirstDigit(M);
// use p
free(p);
答案 1 :(得分:1)
(int [6]){1,1,2,1,2,2};
是函数中定义的本地数组。因此,当函数完成执行时,可以擦除数组的数据。这就是你在printf
1)使用malloc
来分配数组
int* patternForFirstDigit(int digit) {
int *pattern = malloc(6*sizeof(int));
memcpy(pattern, (int [6]){1,1,1,1,1,1}, 6*sizeof(int));
switch (digit) {
case 0:
memcpy(pattern, (int [6]){1,1,1,1,1,1}, 6*sizeof(int));
break;
case 1:
memcpy(pattern, (int [6]){1,1,2,1,2,2};, 6*sizeof(int));
break;
default:
memcpy(pattern, (int [6]){0,0,0,0,0,0}, 6*sizeof(int));
break;
}
for (int i = 0; i < 6; i++) {
printf("%i\n", pattern[i]);
}
return pattern;
}
以及pattern
变得无用时代码中的某些位置,然后使用free(pattern);
2)或者在数组的定义中使用static
:
int* patternForFirstDigit(int digit) {
int *pattern; int i;
static int A[6]={1,1,1,1,1,1};
static int B[6]={1,1,2,1,2,2};
static int C[6]={0,0,0,0,0,0};
pattern = A;
switch (digit) {
case 0:
pattern = A;
break;
case 1:
pattern = B;
break;
default:
pattern = C;
break;
}
for (i = 0; i < 6; i++) {
printf("%i\n", pattern[i]);
}
return pattern;
}
答案 2 :(得分:0)
问题是因为你要返回一个局部变量。局部变量是一个临时变量,在其范围消失后不再可用。您可以尝试以下方法:
int* patternForFirstDigit(int digit, int* pattern) {
int* pattern1 = (int [6]){1,1,1,1,1,1};
int i;
switch (digit) {
case 0:
pattern1 = (int [6]){1,1,1,1,1,1};
break;
case 1:
pattern1 = (int [6]){1,1,2,1,2,2};
break;
default:
pattern1 = (int [6]){0,0,0,0,0,0};
break;
}
memcpy(pattern,pattern1,6*sizeof(int));
for ( i = 0; i < 6; i++) {
printf("%i\n", pattern[i]);
}
return pattern;
}
然后你可以使用它:
pattern = malloc(6*sizeof(int));
pattern=patternForFirstDigit(1, pattern);
int i;
for ( i = 0; i < 6; i++) {
printf("%i\n", pattern[i]);
}
free(pattern);