[英]Program keeps crashing
我是C的新手,因此是指針,所以有些幫助將是很棒的。 當我嘗試運行此代碼時,我的程序多次崩潰。
由於我假定的指針,我的方法punkt_paa_linje返回一個整數而不是字符串。 我對指針的理解很模糊,因此不勝感激。
char punkt_paa_linje(int linje_1[3], int linje_2[3], int punkt[3])
{
int i;
double t1;
double t2;
double t3;
for(i = 0; i < 3; i = i + 1 ){
double t = (punkt[i]-linje_1[i])/linje_2[i];
if(i == 0){
t1 = t;
} else if (i == 1){
t2 = t;
} else if (i == 2){
t3 = t;
}
}
if(t1 == t2 && t2 == t3){
return "true";
} else {
return "false";
}
}
當我調用該函數時,它返回36
int main()
{
int et[] = {1,2,3};
int to[] = {4,5,6};
int tre[] = {7,8,9};
printf("%d\n", punkt_paa_linje(et, to, tre));
return 0;
}
編輯:我沒有插入錯誤消息的原因是因為沒有
您應該使用char *punkt_paa_linje(int linje_1[3], int linje_2[3], int punkt[3])
代替char punkt_paa_linje(int linje_1[3], int linje_2[3], int punkt[3])
。
並使用printf("%s\\n", punkt_paa_linje(et, to, tre));
。 然后,您的代碼將完美運行,並輸出true
。
否則嘗試:
#include <stdio.h>
int punkt_paa_linje(int linje_1[3], int linje_2[3], int punkt[3])
{
int i;
double t1;
double t2;
double t3;
for(i = 0; i < 3; i = i + 1 ){
double t = (punkt[i]-linje_1[i])/linje_2[i];
if(i == 0){
t1 = t;
} else if (i == 1){
t2 = t;
} else if (i == 2){
t3 = t;
}
}
if(t1 == t2 && t2 == t3){
return 1;
}
else {
return 0;
}
}
int main()
{
int et[] = {1,2,3};
int to[] = {4,5,6};
int tre[] = {7,8,9};
printf("%d\n", punkt_paa_linje(et, to, tre));
return 0;
}
輸出:
1
我會盡力解釋你的錯誤。
您正在嘗試返回string
文字。 在靜態存儲持續時間存儲器中,其類型為const char*
及其字符序列 ,如下所示
n n+1 n+2 n+3 n+4 <-- Addresses
+---+---+---+---+----+
|'t'|'r'|'u'|'e'|'\0'|
+---+---+---+---+----+
而且您正在嘗試通過char
返回此字符串, char
是內存中的一個字節 ,如下所示
n
+---+
|'t'|
+---+
因此,您必須返回string
而不是char
,其中string通過指針傳遞到C
第一個字符。
const char * punkt_paa_linje(int linje_1[3], int linje_2[3], int punkt[3])
...
return "true";
%d
說明符期望使用int
類型的參數,而您的函數現在返回具有說明符%s
string
。
printf("%s\n", punkt_paa_linje(et, to, tre));
C
中的數組作為指針傳遞,因此可以使用int * linje_1
或int linje_1[]
代替參數int linje_1[3]
使用-相同,它將接受所有長度的數組。
這是現場演示。 只需單擊運行:-)
您應該調用函數char *punkt_paa_linje
,因為這里它只返回一個char,並且您需要一個str,它是char *
類型。
因此,如果您真的希望函數返回一個char
則將其稱為char punkt_paa_linje
從c中的函數返回字符串時有很多事情:1.永遠不要從函數返回字符串局部變量,因為函數的所有局部變量都將存儲在堆棧中,並且一旦函數返回,堆棧將被破壞,因此局部變量現在將無效。 2.如果要重新運行字符串函數,則應使用:-1.堆內存。 2.靜態變量。 3.字符串常量文字
在示例中,如果要返回字符串,則應使用char *作為函數的返回類型。 字符* punkt_paa_linje()
代替在代碼中的printf中使用%d,請使用%s來打印字符串。 printf(“%s \\ n”,punkt_paa_linje(et,to,tre));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.