Mik*_*ike 1 c arrays pass-by-reference segmentation-fault memory-address
这里有更多的代码,因为我遇到了我现在修复的主要程序的问题.
我有一个修改一系列字节的函数.在这个例子中,该函数应该连续地填充数字1到9的char数组的前9个字节.
进行两项测试.第一个是调用参数所在的函数(char*)&myvar.第二个测试仅用myvar作参数.当我想要在函数的参数部分中返回的字符串时,我以为我总是必须在char数组指针前面使用&.
为什么这个程序只在我不(char*)&添加我的char数组变量时才有效?
当我应用它时,我收到分段错误.
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int func(char* abc){
char *p=abc;
int n;
for (n=1;n<10;n++){
*p=(unsigned char)(n+48);p++;
}
return 0;
}
int main(){
char vars[1000]="234";
char *myvar=vars;
printf("Function test\n");
int result=func((char*)&myvar); //causes segfault
printf("Function result %s\n",myvar); //segfault here
printf("Function test again\n");
int result2=func(myvar); //works
printf("Function result %s\n",myvar);
printf("DONE\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么这个程序只在我不
(char*)&添加我的char数组变量时才有效?
因为这样做是完全错误的,而不是有意义的事情.
当我想要在函数的参数部分中返回的字符串时,我以为我总是必须在char数组指针前面使用&.
你没有.(另外,你没有"char数组指针","当我想要在函数的参数部分返回的字符串"时没有意义.)
当你需要传递一个带有char *a的函数时char *,你不需要在指针前放置任何特殊的前缀.你直接传递它,就像你做的那样
int result2=func(myvar);
Run Code Online (Sandbox Code Playgroud)
vars由于从数组到指向第一个元素的指针的自动转换,你也可以传入,就像你char *myvar=vars;没有任何特殊的转换一样.