【问题标题】:Modifying a struct's pointer to an array to change the result of a different arrays' values修改结构的指向数组的指针以更改不同数组值的结果
【发布时间】:2018-03-11 02:25:05
【问题描述】:

我声明了一个结构如下:

struct threadInfo{
    char *threadArray[10];
}

现在在 main 中,我创建了一个名为 t 的结构的实例。我还创建了一个名为sArray[10] 的不同数组并将其值初始化为"0"。

int main(){
    struct threadInfo t;
    char *sArray[10];
    for (int i = 0; i < 10; i++){
        sArray[i] = "0";
    }
}

我想要完成的是,如果我修改声明的struct threadInfo tthreadArray 值,那么数组sArray 的值应该更改为threadArray 中修改的值。例如:

t.threadArray[0] = "Changed";

那么sArray[0] 也应该是"Changed",但是当我打印sArray[0] 以检查字符串是否变为"Changed" 时,它仍然是"0"

我尝试使用memcpystruct's threadArray 设置为sharedArray,然后修改threadArray 的值,但sharedArray's 的值保持不变。

memcpy(&(t.threadArray), &sharedArray, sizeof(sharedArray);
for (int j = 0; j < 10; i++){
    t.threadArray[i] = "1";
}

我该如何设置,以便每当在函数中修改 threadArray 值时,sArray 值会根据 threadArray 的修改值进行修改?

【问题讨论】:

  • t.threadArray 和 sArray 是完全不同的数组。为什么它们应该是一样的?
  • 我无法传入共享数组,因为我使用结构来传入 pthread_create 的所有参数
  • 你应该在你的问题中发布你真正想要做的事情。否则你只会得到一连串的答案,然后你会说“哦,我实际上不能这样做,因为{我还没有提到的事情}”;这对任何人都没有用,对那些试图提供帮助的人感到沮丧

标签: c arrays string multithreading pointers


【解决方案1】:

当你这样做时

t.threadArray[0] = "Changed";

t.threadArray[i] = "1";

您正在为字符串文字分配一个新的指针值,因此旧位置 t.threadArray[i] 指向的地方丢失了。

如果您想在变量 sArraythreadArray 之间建立链接 结构,那么你有这些选项

  1. sArray[i] 分配内存并分配t.threadArray[i] = sArray[i]。如果要修改内容,则必须使用函数 喜欢strcpy

    strcpy(t.threadArray[i], "Changed");
    

    根据字符串的大小,您需要重新分配 内存来保存一个更大的字符串,所以需要存储在某个地方的大小 分配的内存。

  2. 声明struct threadInfo

    struct threadInfo{
        char **threadArray;
    };
    

    再次为sArray[i]分配内存,你可以这样做: t.threadArray = sArray;。但是在这里你会遇到同样的问题 缓冲区的大小。

例如:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STRING_LENGTH 15

struct threadInfo{
    char **threadArray;
};


void free_sArray(char **arr, size_t len)
{
    if(arr == NULL)
        return;

    for(size_t i = 0; i < len; ++i)
        free(arr[i]);
}

int main(void)
{
    char *sArray[10] = { NULL }; // initialize all to NULL

    for(size_t i = 0; i < sizeof sArray / sizeof sArray[0]; ++i)
    {
        sArray[i] = calloc(MAX_STRING_LENGTH + 1, 1);

        if(sArray == NULL)
        {
            free_sArray(sArray, i);
            return 1;
        }

        // already 0-terminated because of calloc
        sArray[i][0] = '0';
    }

    struct threadInfo t;

    t.threadArray = sArray;

    char *words[] = { "this", "is", "a", "verylongandcomplicatedword", "0", "1", "2", "Change" };

    // how to change the values
    for(size_t i = 0; i < sizeof words / sizeof words[0]; ++i)
    {
        // here important to use strncpy with size MAX_STRING_LENGTH + 1

        // the odds i assign the values through t.threadArray
        // the even i assign the values through sArray
        // changing the one, changes the other

        if(i & 1)
        {
            strncpy(t.threadArray[i], words[i], MAX_STRING_LENGTH + 1);
            t.threadArray[i][MAX_STRING_LENGTH] = 0; // making sure to write \0
        } else {
            strncpy(sArray[i], words[i], MAX_STRING_LENGTH + 1);
            sArray[i][MAX_STRING_LENGTH] = 0; // making sure to write \0
        }
    }

    // how to print
    for(size_t i = 0; i < sizeof sArray / sizeof sArray[0]; ++i)
        printf("Word %zu: '%s' '%s'\n", i, t.threadArray[i], sArray[i]);


    free_sArray(sArray, sizeof sArray / sizeof sArray[0]);

    return 0;
}

哪个会输出

Word 0: 'this' 'this'
Word 1: 'is' 'is'
Word 2: 'a' 'a'
Word 3: 'verylongandcomp' 'verylongandcomp'
Word 4: '0' '0'
Word 5: '1' '1'
Word 6: '2' '2'
Word 7: 'Change' 'Change'
Word 8: '0' '0'
Word 9: '0' '0'

但是我看不出这样做有什么意义,如果你想把它传递给一个线程, 您可以在主线程中使用相同的对象:

struct threadInfo t;

// initialize t

pthread_t th;

pthread_create(&th, NULL, your_thread, &t);

// here if you do
strcpy(t.threadArray[3], "Change");
// the thread will see the change as well

但如果你这样做,你将不得不将线程与主线程同步 在修改threadArray[i]的内容时最好使用互斥锁。

【讨论】:

    【解决方案2】:

    main 中的代码可能是:

    struct threadInfo t;
    char **sArray = t.threadArray;
    

    那么sArray[0]表示与t.threadArray[0]相同的内存位置。

    【讨论】:

    • 我怎样才能创建它以使 t.threadArray 指示与 sArray 相同的内存位置?因为如果我有多个 threadInfo 结构,我希望它们都具有与 sArray 相同的内存位置。
    • 在我的回答sArray中,t.threadArray的衰减结果都指向同一个内存位置。您的问题没有提及 threadInfo 的多个结构
    猜你喜欢
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 2016-06-20
    相关资源
    最近更新 更多