繁体   English   中英

如何在此处复制值而不是 C 中的指针地址?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM