我尝试输入字符串,将它们发送到线程,然后将它们转换为整数并相加。我的结果应该是1+1 = 2。但我得到了49+49 = 98
main.c: In function ‘prints’:
main.c:10:7: warning: assignment to ‘int’ from ‘int *’ makes integer from pointer without a cast [-Wint-conversion]
10 | c = (int *) string;
| ^
main.c:11:9: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
11 | a = (int *) string[0];
| ^
main.c:11:7: warning: assignment to ‘int’ from ‘int *’ makes integer from pointer without a cast [-Wint-conversion]
11 | a = (int *) string[0];
| ^
main.c:12:9: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
12 | b = (int *) string[1];
| ^
main.c:12:7: warning: assignment to ‘int’ from ‘int *’ makes integer from pointer without a cast [-Wint-conversion]
12 | b = (int *) string[1];
| ^
In function main(): Creating a new thread
11
Given input -1341915086 and sum of 49 and 49 is 98
这是我的代码。最初我把字符串作为静态的,把它们发送到我的线程。打印工作正常,它得到了字符串中所需的值。
#include<stdio.h>
#include <pthread.h>
#include<string.h>
#include <stdlib.h>
void *prints(void *str) {
int a,b,c, sum;
char *string = (char *) str;
printf("%s\n",string);
c = (int *) string;
a = (int *) string[0];
b = (int *) string[1];
sum = a+b;
printf("Given input %d and sum of %d and %d is %d",c,a,b,sum);
}
int main(int argc, char *argv[]) {
pthread_t threadID;
const char *word = "11"; // string literals are immutable
printf("In function main(): Creating a new thread\n");
int status = pthread_create(&threadID, NULL, prints, (char *)word);
pthread_join(threadID, NULL);
}
2条答案
按热度按时间6yt4nkrj1#
我的结果应该是1+1 = 2,而不是49+49 = 98
字符
'1'
的ASCII
代码为0x31
或49
十进制(请参见man ascii)。您需要:
说明:字符
'0'
到'9'
的ASCII
代码是连续的(以0x30
开始,以0x39
结束),因此使用'0'
作为基数来确定给定数字的数值。raogr8fs2#
string[0] - '0'
可以将字符符号转换为整数,这是你在考虑学习多线程之前应该学习的基础知识,或者你可以使用strtol
函数将整个字符串转换为单个整数。除此之外,问题是你正在做非常奇怪的强制转换和无效转换。语法方面,C允许各种各样的疯狂强制转换,但这并不意味着最终结果是定义良好的或可用的。
string
是一个指向字符数组的char*
。它可能没有对齐。如果你取消引用*c
,你违反了“严格别名”。未定义的行为,任何事情都可能发生。a = (int *) string[0];
这是无意义的,因为string[0]
是char
,而不是指针,很可能char
的值在大多数系统上可以被重新解释为指针,但这样做是完全没有意义的。此外,你不能给int
赋值一个指针,这样做是无效的C。也可能发生未定义的行为和任何事情或什么都不发生。b = ...
相同。return
,否则您也会在那里调用未定义的行为。您可以通过监听编译器警告来避免所有类似的问题,或者更好的方法是将它们升级为错误,以便在第一时间阻止无效代码生成可执行文件。