程序不断崩溃

时间:2017-08-18 16:12:27

标签: c crash

我是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;
}

编辑:我没有插入错误消息的原因是因为没有

4 个答案:

答案 0 :(得分:3)

您应该使用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

答案 1 :(得分:2)

我会尝试解释你的错误。

您正在尝试返回string字面值。其中静态存储空间内存中的类型为const char*及其字符序列,如下所示

  n  n+1 n+2 n+3 n+4      <-- Addresses
+---+---+---+---+----+
|'t'|'r'|'u'|'e'|'\0'|
+---+---+---+---+----+

你试图通过char返回此字符串,内存中一个字节,就像这样

  n
+---+
|'t'|
+---+

所以你必须返回string而不是char,其中字符串通过指针传递给C中的第一个字符。

const char * punkt_paa_linje(int linje_1[3], int linje_2[3], int punkt[3])
...
return "true";

%d说明符需要int类型的参数,而您的函数现在返回string,其具有说明符%s

printf("%s\n", punkt_paa_linje(et, to, tre));

C中的数组作为指针传递,因此使用int linje_1[3]int * linje_1只需使用int linje_1[]<script async defer src="https://maps.googleapis.com/maps/api/js?key=my api key=google-map" type="text/javascript"></script>而不是参数 //Google Map var latitude = $('#google-map').data('latitude') var longitude = $('#google-map').data('longitude') function initialize_map() { var myLatlng = new google.maps.LatLng(latitude,longitude); var mapOptions = { zoom: 14, scrollwheel: false, center: myLatlng }; var map = new google.maps.Map(document.getElementById('google-map'), mapOptions); var contentString = ''; var infowindow = new google.maps.InfoWindow({ content: '<div class="map-content"><ul class="address">' + $('.address').html() + '</ul></div>' }); var marker = new google.maps.Marker({ position: myLatlng, map: map }); google.maps.event.addListener(marker, 'click', function() { infowindow.open(map,marker); }); } google.maps.event.addDomListener(window, 'load', initialize_map); });,它将接受所有数组长度。

Here is live demo. 只需点击运行: - )

答案 2 :(得分:1)

你应该调用你的函数char *punkt_paa_linje,因为这里只返回一个字符,你需要一个str,这是char *类型。

因此,如果您真的希望您的函数返回char,请将其调用char punkt_paa_linje

答案 3 :(得分:0)

从c中的函数返回字符串时有很多事情: - 1.Never从函数返回字符串局部变量,因为函数的所有局部变量都将存储在堆栈中,一旦函数返回,堆栈将被销毁,因此本地变量现在将无效。 2.如果你想重新使用字符串功能,你应该使用: -     1.记忆。     2.static变量。     3.String constant literal。

在您的示例中,如果要返回字符串,则应使用char *作为函数的返回类型。 char * punkt_paa_linje()

代替在代码中使用%f中的%d,使用%s打印字符串。 printf(&#34;%s \ n&#34;,punkt_paa_linje(et,to,tre));