当你这样做时
t.threadArray[0] = "Changed";
或
t.threadArray[i] = "1";
您正在为字符串文字分配一个新的指针值,因此旧位置
t.threadArray[i] 指向的地方丢失了。
如果您想在变量 sArray 和 threadArray 之间建立链接
结构,那么你有这些选项
-
为sArray[i] 分配内存并分配t.threadArray[i] =
sArray[i]。如果要修改内容,则必须使用函数
喜欢strcpy
strcpy(t.threadArray[i], "Changed");
根据字符串的大小,您需要重新分配
内存来保存一个更大的字符串,所以需要存储在某个地方的大小
分配的内存。
-
声明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]的内容时最好使用互斥锁。