[英]How do I copy the value not the address of a pointer in C here?
我希望将names[j]
的值放入diddle()
function 中的name
中。 我尝试了几件事,当我返回它时, name
中的值反映了将name[j]
更改为"0"
,或者我得到了一个段错误。 我错过了什么?
randomGenerator
返回对应于names[]
索引的 integer 。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
char* names[9];
//char* diddle(char *names[]) {
void diddle(char *names[], char *name) {
int i;
while (1) {
int j = randomGenerator(0,9);
printf("j is %d\n",j);
int x;
x = strcmp(names[j],"0");
printf("names[j] is %s and x is %d\n",names[j],x);
if (x != 0) {
strcpy(name,names[j]);
strcpy(names[j],"0");
break;
}
}
//return name;
}
int main() {
names[0] = (char *) malloc(4 * sizeof(char*));
strcpy(names[0],"foo");
names[1] = (char *) malloc(4 * sizeof(char*));
strcpy(names[1],"bar");
names[2] = (char *) malloc(4 * sizeof(char*));
strcpy(names[2],"baz");
names[3] = (char *) malloc(4 * sizeof(char*));
strcpy(names[3],"qux");
names[4] = (char *) malloc(4 * sizeof(char*));
strcpy(names[4],"zed");
names[5] = (char *) malloc(4 * sizeof(char*));
strcpy(names[5],"pug");
names[6] = (char *) malloc(4 * sizeof(char*));
strcpy(names[6],"unk");
names[7] = (char *) malloc(4 * sizeof(char*));
strcpy(names[7],"fed");
names[8] = (char *) malloc(4 * sizeof(char*));
strcpy(names[8],"hip");
names[9] = (char *) malloc(4 * sizeof(char*));
strcpy(names[9],"gib");
int i;
for(i = 0; i < 7; i++) {
//char *name = diddle(&names[0]);
char *name = NULL;
diddle(&names[0],&name);
printf("main loop: name is %s\n", name);
}
for (i = 0; i < 10; i++) {
free(names[i]);
}
}
如果您有一个声明为的数组
char* names[9];
那么这个数组的有效索引范围是[0, 9)
。
所以这些陈述
names[9] = (char *) malloc(4 * sizeof(char*));
strcpy(names[9],"gib");
访问索引无效的数组中不存在的元素9
。
这个循环
for (i = 0; i < 10; i++) {
free(names[i]);
}
由于同样的原因也是不正确的。
不要使用像 9 0r 10 这样的幻数。例如使用命名常量
enum { N = 9 };
char* names[N];
//...
for (i = 0; i < N; i++) {
free(names[i]);
}
将数组names
声明为全局变量是没有意义的。 您可以在 main.js 中声明它。
虽然分配的 memory
names[0] = (char *) malloc(4 * sizeof(char*));
可以容纳四个字符的字符串
strcpy(names[0],"foo");
然而,这样的分配只会让代码的读者感到困惑。 而是在此写下其他类似的陈述
names[0] = (char *) malloc(4 * sizeof(char));
^^^^^
要不就
names[0] = (char *) malloc( 4 );
Th function diddle
第二个参数的类型为char *
void diddle(char *names[], char *name) {
但在 function 通话中
diddle(&names[0],&name);
使用了char **
类型的表达式&name
。
结果这个声明
strcpy(name,names[j]);
调用未定义的行为。 即使传递的表达式具有正确的类型
diddle(&names[0],&name);
尽管如此,function 再次具有未定义的行为,因为传递的指针是 null 指针。 因此,您不能将strcpy
与 null 指针一起使用。
而不是 null 指针
char *name = NULL;
你可以使用一个字符数组,比如
char name[4];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.