簡體   English   中英

程序不斷崩潰

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM